Как я могу преобразовать эту часть кода VB6 в C#?
Я попробовал самостоятельно и добрался до сих пор до:
Править: Код, который я пытаюсь перевести, существует здесь: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx
Вы не показали , что код
, что делает невозможным сказать, действительно. Но в целом:
With expression
.Foo = a
.Bar = b
End With
будет переводиться на
var x = expression;
x.Foo = a;
x.Bar = b;
(конечно, вы можете указать тип явно ...)
Общность здесь состоит в том, что выражение
только один раз оценивается. В конкретном конкретном коде вы показали, что нет необходимости в дополнительной переменной, конечно, поскольку выражение только локальная переменная в первую очередь.
Ваша фактическая ошибка выглядит так, будто она просто связана с типами Eventththief.right_down
etc, а не с оператором с оператором.
Отредактируйте: Хорошо, вы теперь показали оригинальный код события, который использует Booleans ... Но вы не показали портированных , что код
. Вы писали:
Это говорит, что et.left_up - это короткий
... Но это не должно быть. В оригинале это Boolean
, так почему же он короткий
в вашем порту?
Следующее в VB
With EventStealingInfo
.RIGHT_DOWN = True
.RIGHT_UP = True
End With
может быть примерно переведено на
var EventStealingInfo = new EventThief(){
RIGHT_DOWN = true,
RIGHT_UP = true
};
где right_up
и PROVER_DOWN
являются общедоступными свойствами в EventStealingInfo
класс.
Эта конструкция в C # известна как инициализатор объекта .
Я думаю, что это ближе, вы можете пойти:
EventThief EventStealingInfo = new EventThief()
{
RIGHT_DOWN = true,
RIGHT_UP = true
};
Могу ли я назвать ваше предложение Вариант А.
Могу ли я предложить вариант B и вариант C, который, на мой взгляд, будет проще?
Вариант B
1. Начните с кода C# от Microsoft для работы с Windows hooks.
2. Адаптируйте его по мере необходимости, посмотрев, что API называет кодом VB6.
Вариант C
1. Возьмем собранный VB6 DLL из кода сообщества .
2. Вызовите эту DLL из вашего нового приложения на C# через Интерп.
Не существует эквивалента с в C #, насколько я знаю, и вам нужно явно перечислите объект при упомянутых его функциях / свойствах.
Разве вы не можете просто изменить тип левой_уп, чтобы быть Bool?
Глядя на ваш код и то, как вы используете событие, вы можете использовать перечисление флага, чтобы вы могли установить отдельные биты и Тогда делайте побитовые сравнения.
Отсутствует прямая замена. Эта запись в блоге описывает, как выполнить эквивалентное действие, определяя последнюю фиксацию, затем определяя хэш для файла в этой фиксации, а затем выгружая его.
git log ...
git ls-tree ...
git show -p ...
(запись блога содержит опечатки и использует вышеуказанное с командой svn
)
На самом деле это не ошибка. Это проблема с изменениями версий собственного проекта! Поскольку в конечном прогоне не используются исходные импортированные ссылки при компиляции!
Например, я создавал сервер чата, клиент. Я использовал структуру пакетов для передачи данных о клиентском проекте. Затем импортирована та же ссылка на серверный проект.
При вызове Packet packet = (Packet) bineyFormatter.Deserialize (stream);
У меня та же ошибка. Поскольку фактическая выполняемая ссылка в серверном проекте не является ссылкой сейчас в клиентском проекте! Потому что я перестраивал клиентский проект много раз после!
При создании < new object > = (< new object >) < old object >
новый объект всегда должен быть более новой или такой же версией, как старый объект!
Поэтому я построил отдельный проект для создания DLL для класса Packet и импортировал файл DLL в оба проекта.
При изменении класса Packet необходимо снова импортировать ссылку как на клиент, так и на сервер.
Тогда кастинг не даст вышеуказанного исключения!
-121--4245478-Ключевое слово «with» является просто ярлыком для сохранения повторного ввода имени переменной при установке нескольких свойств. Эквивалент в C # отсутствует.
Даже если бы у вас была проблема, вы, очевидно, пытаетесь назначить логическое значение короткому типу данных.
Что такое в классе EventThief? Можете ли вы просто сделать LEFT_UP поля логическими?
Вроде так
With EventStealingInfo
.RIGHT_DOWN = True
.RIGHT_UP = True
End With
становится
EventStealingInfo.RIGHT_DOWN = true;
EventStealingInfo.RIGHT_UP = true;