У меня проблемы с COM Interop, ситуация следующая:
32-битный сервер COM Exe (который был запрограммирован на C ++) предлагает класс с некоторыми функциями-членами, которые работают с оборудованием сторонних производителей (это оборудование также связывает сервер COM Exe с 32-битным, так как производитель не поддержка 64-бит).
Я хочу использовать 32-разрядный сервер COM Exe в 64-разрядном приложении .NET (C #) ... Сначала я попытался добавить ссылку на сервер Exe в Visual Studio 2010, и он создал Interop- DLL. Эта Interop-DLL предоставила мне необходимые функции, одна из которых была объявлена как:
int Initialize(ref string callingApplicationPath);
Исходное объявление в C ++ выглядит так:
LONG Class::Initialize(BSTR* callingApplicationPath)
... и вот так в IDL:
[id(1)] LONG Initialize([in] BSTR* callingApplicationPath);
Однако, когда я хочу вызвать эту функцию из C # через Interop-DLL, она выдает исключение BadImageFormatException. Похоже, что Interop-DLL является 32-битной DLL (может быть, есть возможность генерировать 64-битную DLL?).
Моя следующая попытка состояла в том, чтобы создать экземпляр Exe-сервера с помощью этого кода:
Type type = Type.GetTypeFromProgID("OurCompany.Class");
Object o = Activator.CreateInstance(type);
Object[] args = { Marshal.StringToBSTR(str) };
Object result = type.InvokeMember("Initialize", BindingFlags.InvokeMethod, null, o, args);
Этот код, с другой стороны, вызывает исключение TargetInvocationException (более конкретно: 0x80020005 (DISP_E_TYPEMISMATCH)) в моей голове. К сожалению, я не смог выяснить, какой тип мне нужно передать в функцию из C # ... Я перепробовал все функции StringToXXX в классе Marshal, но, похоже, ничего не работает: , но я не вижу, что.
Любая помощь очень ценится!
С наилучшими пожеланиями
Christian