2011-05-11 20 views
8

我们有一个COM注册的旧C/C++ .dll。我们的客户拥有使用该.dll的本地和.NET客户端。在客户端使用与.NET版本相同的.NET版本替换COM注册的.dll时,.NET客户端崩溃

我们已经构建了一个新的.NET .dll来替换旧的,即它们的COM接口是相同的。我们希望替换旧的.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 

这引发以下exeption:

.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的上下文“LoadFrom”中的'BARAPIXLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。 DLL”。

类型B来源于位于'C:\ arkiv \ Bartrack \ BartrackTest \ x86 \ Src \ BartrackTest \ bin'上下文'Default'中的'BartrackTest,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null' \ 86 \发布\ BartrackTest.exe”。“}

任何想法,将不胜感激。

+0

任何机会我们可以看到DLL方法引用的声明以及一些调用代码? – pickypg

+0

你的意思是客户怎么称呼我们的.dll?这是我们所不知道的,但他们可能会在Visual Studio中完成“添加引用”。我们希望用新的.NET代替旧的C/C++ COM .dll,而不需要重新编译客户端或任何东西。如果这是可能的。 – Poppert

回答

1

尝试取消注册任何以前的版本,并检查该DLL是在同一个文件夹中的可执行文件。也可以尝试寻找在你从哪里加载的DLL我认为你正在加载它manualy所以看看你所引用的错误的DLL地址

+0

感谢您的回复!我们取消了注册旧的C/C++ .dll,用新的.NET替换了这个文件(使用相同的文件名并在同一目录中),并使用regasm进行注册。但客户仍然无法工作(无需重新编译等)。它基本上说不能将SomeTypeA转换为SomeTypeAClass(“类”以某种方式附加到类型名称后面)。 – Poppert

1

这可能是因为在使用相同版本的.net框架的情况下,返回给客户端的实例不再是一个COM包装器,而是一个纯净的.Net对象,因此当您试图将其转换为COM接口失败。 还有一个类似的问题here。解决方案涉及使用Primary Interop Assembly

+0

感谢您的回复! 我们的客户已经对我们的旧C/C++ COM.dll做了“添加引用”,因此客户端.exe使用的客户端目录中有一个“Interop.blablabla.dll”。 我们是否可以强制客户的客户使用新的主Interop程序集而不是他们已经使用的程序集(而不需要重新编译客户端等)? – Poppert

+0

@Ppertpert我很担心这是不可能的。据我所知,PIA可能会有不同的类型名称。无论哪种方式,在这个主题上专门发布一个新的SO问题可能是一个好主意,你可能会得到一些有创意的解决方案。 – yms