2011-05-11 9 views
8

Mamy starą wersję C/C++ .dll, która jest zarejestrowana w COM. Nasi klienci mają zarówno klientów natywnych, jak i .NET, którzy używają tego .dll.Klient .NET crasch przy wymianie zarejestrowanego katalogu COM .dll na nowy w tej samej wersji .NET jako klient

Zbudowaliśmy nowy .NET .dll, aby zastąpić stary, tzn. Ich interfejs COM jest identyczny. Chcielibyśmy zastąpić starą .dll bez naszego klienta, aby przekompilować lub zrobić coś dla swoich klientów.

Dla klientów natywnych działa dobrze po prostu wyrejestrować starego .dll i zarejestrować nowy (z regasm). Działa również dla niektórych klientów .NET. Jednak w tych przypadkach zarówno klient, jak i nowy .dll jest skompilowany z tą samą wersją .NET, zgłasza wyjątek poniżej.

Innymi słowy, to działa:

.dll is .NET 3.5 -> client is .NET 4.0 
.dll is .NET 4.0 -> client is .NET 3.5 
.dll is any .NET -> Client is native 

To rzuca exeption poniżej:

.dll is .NET 4.0 -> client is .NET 4.0 
.dll is .NET 3.5 -> client is .NET 3.5 

[A] BARAPIXLib.barcom5 nie mogą być oddane do [B] BARAPIXLib.barcom5.

Typ A pochodzi z 'BARAPIXLib, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' w kontekście 'LoadFrom' w lokalizacji C: \ arkiv \ S_BTW \ BTW \ BARAPIXWebService \ Barapix \ bin \ BARAPIXLib. dll ".

Typ B pochodzi od 'BartrackTest, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' w kontekście "Default" w lokalizacji 'C: \ arkiv \ Bartrack \ BartrackTest \ x86 \ Src \ BartrackTest \ bin \ x86 \ Release \ BartrackTest.exe”."}

Wszelkie pomysły będą mile widziane.

+0

Czy istnieje szansa, że ​​możemy zobaczyć deklarację odwołania do metody DLL, a także kod wywołujący? – pickypg

+0

Masz na myśli, jak klienci nazywają nasze .dll? Nie jest to nam znane, ale prawdopodobnie zrobilibyśmy "Dodaj referencję" w Visual Studio. Chcemy zastąpić naszą starą wersję C/C++ COM .dll nową wersją .NET, bez konieczności ponownej kompilacji klientów lub czegokolwiek. Jeśli to możliwe. – Poppert

Odpowiedz

1

Spróbuj wyrejestrowanie poprzedniej wersji i sprawdzić, czy dll jest w tym samym folderze co plik wykonywalny. Sponsorowane patrząc w miejscu, w którym ładujesz bibliotekę DLL. Myślę, że ładujesz ją ręcznie, więc spójrz na adres, do którego odwołujesz się do niewłaściwej biblioteki DLL.

+0

Dzięki za odpowiedź! Wyrejestrowaliśmy stary plik C/C++ .dll, zastąpiliśmy go nowym .NET (używając tej samej nazwy pliku w tym samym katalogu) i zarejestrowaliśmy go przy użyciu regasm. Ale klient nadal nie działa (bez konieczności ponownej kompilacji itp.). Zasadniczo mówi: Nie można rzucić SomeTypeA do SomeTypeAClass ("Class" jest w jakiś sposób dołączony do nazwy typu). – Poppert

1

Może to być spowodowane tym, że w przypadku, gdy używasz tej samej wersji architektury .net, instancja zwrócona do klienta nie jest już opakowaniem COM, ale czystym obiektem .Net, więc gdy próbujesz przesłać go do Interfejs COM nie działa. Istnieje podobne pytanie here. Rozwiązanie wymaga użycia Primary Interop Assembly.

+0

Dzięki za odpowiedź! Nasi klienci dodali już "Dodaj odwołanie" do naszego starego C/C++ COM .dll, więc istnieje plik "Interop.blablabla.dll" w katalogu klienta, którego używa klient .exe. Czy możemy zmusić klientów naszych klientów do skorzystania z nowego głównego zespołu interopijnego zamiast tego, z którego już korzystają (bez konieczności ponownej kompilacji itd.)? – Poppert

+0

@Poppert Obawiam się, że to niemożliwe. O ile mi wiadomo, PIA prawdopodobnie będzie mieć inne nazwy typów.W każdym razie dobrym pomysłem jest opublikowanie nowego pytania SO na ten temat, możesz uzyskać pewne kreatywne rozwiązania. – yms

Powiązane problemy