.NET客户端在将COM注册的.dll替换为与客户端相同.NET版本的新.dll时崩溃

.NET客户端在将COM注册的.dll替换为与客户端相同.NET版本的新.dll时崩溃,.net,dll,com,.net,Dll,Com,我们有一个旧的C/C++.dll,它是COM注册的。我们的客户既有使用此.dll的本机客户端,也有.NET客户端 我们构建了一个新的.NET.dll来替换旧的,即它们的COM接口是相同的。我们希望在客户不需要重新编译或对其客户机执行任何操作的情况下替换旧的.dll 对于本机客户端,只需注销旧的.dll并注册新的.dll(使用regasm)即可。它也适用于一些.NET客户端。但是,在这些情况下,客户端和新的.dll都是使用它引发下面异常的相同.NET版本编译的 换句话说,这是有效的: .dll i

我们有一个旧的C/C++.dll,它是COM注册的。我们的客户既有使用此.dll的本机客户端,也有.NET客户端

我们构建了一个新的.NET.dll来替换旧的,即它们的COM接口是相同的。我们希望在客户不需要重新编译或对其客户机执行任何操作的情况下替换旧的.dll

对于本机客户端,只需注销旧的.dll并注册新的.dll(使用regasm)即可。它也适用于一些.NET客户端。但是,在这些情况下,客户端和新的.dll都是使用它引发下面异常的相同.NET版本编译的

换句话说,这是有效的:

.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
这将抛出下面的例外:

.dll is .NET 4.0 -> client is .NET 4.0
.dll is .NET 3.5 -> client is .NET 3.5
[A] BARAPIXLib.barcom5不能转换为[B]BARAPIXLib.barcom5

类型A源于位于C:\arkiv\S_BTW\BTW\BARAPIXWebService\Barapix\bin\BARAPIXLib.dll的上下文“LoadFrom”中的“BARAPIXLib,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”

类型B源于“C:\arkiv\Bartrack\BartrackTest\x86\Src\BartrackTest\bin\x86\Release\BartrackTest.exe”上下文“Default”中的“BartrackTest,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”


如果您有任何想法,我们将不胜感激。

请尝试注销任何以前的版本,并检查dll是否与可执行文件位于同一文件夹中。还请尝试查看加载dll的位置。我认为您是手动加载的,因此请查看引用错误dll的地址。

这可能是因为如果您使用的是同一版本的.net framework,则返回给客户端的实例不再是COM包装器,而是纯.net对象,因此当您尝试将其强制转换为COM接口时,它将失败。
还有一个类似的问题。解决方案涉及使用。

我们是否有可能看到DLL方法引用的声明以及一些调用代码?您的意思是客户机如何调用我们的.DLL?这对我们来说是未知的,但他们可能已经执行了“添加引用”操作“在Visual Studio中。我们想用一个新的.NET来替换旧的C/C++COM.dll,而不需要重新编译客户端或做任何事情。如果可能的话。谢谢你的回复!我们的客户已经对旧的C/C++COM.dll进行了“添加引用”,因此client.exe使用的client dir中有一个“Interop.blabla.dll”。我们是否可以强制客户的客户端使用新的主互操作程序集,而不是他们已经在使用的程序集(而不必重新编译他们的客户端等)?@Poppert我很惊讶这是不可能的。据我所知,PIA可能会有不同的类型名称。无论哪种方式,在这个主题上发布一个新的SO问题可能是一个好主意,你可能会得到一些创造性的解决方案。谢谢你的回复!我们注销了旧的C/C++.dll,用新的.NET文件替换了该文件(使用相同的文件名和目录),并使用regasm注册了它。但是客户端仍然不能工作(不需要重新编译等)。它基本上说不能将SomeTypeA强制转换为SomeTypeAClass(“类”以某种方式附加到类型名)。