У меня есть несколько 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, есть ли способ получить статическую проверку типа?
COM поддерживает свойства по умолчанию, свойство с DISPID 0. Выглядит как RawValue такое свойство. C# не нравится свойства по умолчанию за пределами индексатора, RawValue не квалифицируется, поскольку свойство getter не принимает аргумента. Вам лучше сказать это. –
Основная проблема с RawValue заключается в том, что она имеет динамический тип, поэтому я не могу использовать проверку статического типа, которую я получаю с _Property. – CookieOfFortune
У меня проблемы, вам не нравится набирать подчеркивание или что-то в этом роде? Вы можете отредактировать IL из сборника interop, но это немного грубо. Объектная модель не очень понятна. –