Wir haben eine alte C / C ++ .dll, die COM-registriert ist. Unsere Kunden haben sowohl native als auch .NET-Clients, die diese .dll verwenden.
Wir haben eine neue .NET-DLL erstellt, um die alte zu ersetzen, d. h. ihre COM-Schnittstelle ist identisch. Wir möchten die alte .dll ersetzen, ohne dass unsere Kunden ihre Clients neu kompilieren müssen.
Für native Clients funktioniert es gut, die alte .dll einfach abzumelden und die neue (mit regasm) zu registrieren. Es funktioniert auch für einige .NET-Clients. In diesen Fällen wird jedoch sowohl der Client als auch die neue DLL mit derselben .NET-Version kompiliert, die die Ausnahme unten auslöst.
Mit anderen Worten, das funktioniert:
%Vor%Dies wirft die folgende Ausnahme auf:
%Vor%[A] BARAPIXLib.barcom5 kann nicht in [B] BARAPIXLib.barcom5 umgewandelt werden.
Typ A stammt von "BARAPIXLib, Version = 1.0.0.0, Culture = Neutral, PublicKeyToken = null" im Kontext "LoadFrom" am Speicherort C: \ arkiv \ S_BTW \ BTW \ BARAPIXWebService \ Barapix \ bin \ BARAPIXLib.dll '.
Typ B stammt von 'BartrackTest, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' im Kontext 'Standard' am Speicherort 'C: \ arkiv \ Bartrack \ BartrackTest \ x86 \ Src \ BartrackTest \ bin \ x86 \ Release \ BartrackTest.exe '. "}
Irgendwelche Ideen würden geschätzt werden.
Versuchen Sie, die Registrierung einer früheren Version aufzuheben, und überprüfen Sie, ob sich die DLL im selben Ordner wie die ausführbare Datei befindet. Versuchen Sie auch zu sehen, wo Sie die DLL laden. Ich denke, dass Sie es manuell laden, also schauen Sie auf die Adresse, die Sie auf die falsche DLL beziehen.
Dies liegt möglicherweise daran, dass die Instanz, die an den Client zurückgegeben wird, nicht mehr ein COM-Wrapper, sondern ein reines .NET-Objekt ist. Wenn Sie also versuchen, es in ein COM-Schnittstelle schlägt fehl. Es gibt eine ähnliche Frage hier . Die Lösung beinhaltet die primäre Interop-Assembly .