2011-12-30 2 views
0

У меня есть несколько COM-библиотек (TISCOPELib и MIPPARAMLib), которые я использовал на C++ (неуправляемый), и теперь я перехожу на C#.Использование COM-взаимодействия (преобразование из C++ в C# /. NET)

Этот фрагмент кода работает в 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 ... 

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

An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Anonymously Hosted DynamicMethods Assembly

Additional information: Cannot implicitly convert type 'System.__ComObject' to 'int'

System.__ComObject в этом случае, как предполагается, IMipParameter с int как RawValue собственности.

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

+0

COM поддерживает свойства по умолчанию, свойство с DISPID 0. Выглядит как RawValue такое свойство. C# не нравится свойства по умолчанию за пределами индексатора, RawValue не квалифицируется, поскольку свойство getter не принимает аргумента. Вам лучше сказать это. –

+0

Основная проблема с RawValue заключается в том, что она имеет динамический тип, поэтому я не могу использовать проверку статического типа, которую я получаю с _Property. – CookieOfFortune

+0

У меня проблемы, вам не нравится набирать подчеркивание или что-то в этом роде? Вы можете отредактировать IL из сборника interop, но это немного грубо. Объектная модель не очень понятна. –

ответ

1

Попробуйте

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

Да, это тоже работает, но я до сих пор не получаю проверку статического типа, которую я получил бы с помощью _Position. – CookieOfFortune

Смежные вопросы