Mam pewne problemy z modelu COM, sytuacja przedstawia się następująco:Zastosowanie 32bit COM Server z programem 64-NET
32-Bit COM Exe Server (który został zaprogramowany w języku C++) oferuje klasę z niektórymi funkcjami członkowskimi, które dotyczą sprzętu innego producenta (sprzęt ten wiąże również serwer COM exe z 32-bitowym, ponieważ producent nie obsługuje wersji 64-bitowej).
Chcę używać 32-bitowego COM Exe Server w 64-bitowej aplikacji .NET (C#) ... Najpierw próbowałem dodać odwołanie do serwera Exe w Visual Studio 2010 i utworzyłem Interop -DLL. Ten Interop DLL-dostarczyła mi niezbędne funkcje, jedną z nich jest zadeklarowana jako:
int Initialize(ref string callingApplicationPath);
oryginalnej deklaracji w C++ wygląda następująco:
LONG Class::Initialize(BSTR* callingApplicationPath)
... i tak w IDL:
[id(1)] LONG Initialize([in] BSTR* callingApplicationPath);
jednak, gdy chcę wywołać tę funkcję z C# za pośrednictwem Interop-DLL, to rzuca BadImageFormatException. Wygląda na to, że Interop-DLL jest 32-bitową biblioteką DLL (może istnieje możliwość wygenerowania 64-bitowej biblioteki DLL?).
Moja następna próba była instancji serwera Exe z tym kodem:
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);
Kod ten, z drugiej strony, rzuca TargetInvocationException (dokładniej: 0x80020005 (DISP_E_TYPEMISMATCH)) w mojej głowie. Niestety nie byłem w stanie dowiedzieć się, jaki typ muszę przekazać do funkcji z C# ... Próbowałem wszystkich funkcji StringToXXX w klasie Marshal, ale nic nie działa:/Chyba brakuje mi czegoś prostego tutaj , ale nie widzę co.
Każda pomoc jest bardzo doceniana!
Pozdrawiam
Christian
Czy próbowałeś uruchomić Monitor procesu i sprawdzić, co się dzieje, gdy instancja jest wykonywana? Może nie znajduje się w niektórych wpisach do rejestru lub jakiś proces ma niewystarczające uprawnienia? Process Monitor migt pomaga w tym. – sharptooth
@sharptooth: Sama instancja działa dobrze i mogę z powodzeniem wywołać metodę Dummy, która nie przyjmuje argumentów i zwraca int. Problem polega tylko na "System.String -> BSTR * konwersji – Christian
Widzę. Jaki jest sens przekazania BSTR * jako parametru "in"? Dlaczego nie tylko BSTR? – sharptooth