Использование COM Interop (преобразование из C ++ в C # /. NET) - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть несколько COM-библиотек (TISCOPELib и MIPPARAMLib), которые я использовал в C ++ (неуправляемые), и теперь я конвертирую в C #.

Этот фрагмент кода работает в C ++:

TISCOPELib::IFilterBlockCasette *casette;
... inialization ...
int position = casette->Position;
... other stuff ...

В C # мне нужно будет выполнить одно из следующих действий:

TISCOPELib.IFilterBlockCasette casette = microscope.FilterBlockCasette1; // Init stuff.
MIPPARAMLib.IMipParameter param = casette.Position;
int position = param.RawValue;
... other stuff ...

или

TISCOPELib.IFilterBlockCasette casette = microscope.FilterBlockCasette1; // Init stuff.
int position = casette._Position;
... other stuff ...

Если бы я сделал это:

TISCOPELib.IFilterBlockCasette casette = microscope.FilterBlockCasette1; // Init stuff.
int position = casette.Position;
... other stuff ...

Я получил бы следующую ошибку:

Произошло необработанное исключение типа 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' в сборке DynamicMethods с анонимным размещением

Дополнительная информация: Не удается неявно преобразоватьвведите 'System .__ ComObject' в 'int'

. В этом случае System.__ComObject должно быть IMipParameter с int в качестве свойства RawValue.

Так каков лучший курс действий здесь?Используйте промежуточный шаг IMipParameter, используйте _Position, или есть другое решение?Если я использовал IMipParameter, есть ли способ получить статическую проверку типов?

1 Ответ

1 голос
/ 30 декабря 2011

Попробуйте

int position = (int)casette.Position.RawValue;
...