2011-03-31 82 views
1

我们的客户使用旧版Win32客户端,它使用我们提供的本地C++ COM注册.dll。用.NET COM替换原生C++ COM .dll

我们希望用.NET版本替换原生.dll。所以我们已经构建了.NET DLL并且COM注册了它。我们有本地的C++测试客户端,它们能够处理从旧的.dll到新的交换,但是......似乎我们需要重新编译它们才能正常工作。

为什么我们需要重新编译测试客户端,或者我们做错了什么,是否有一些合乎逻辑的原因?

我们不能要求我们的客户重新编译他们的客户。

+0

可能因为TLB文件或GUID不同,所以它不会识别新的接口。我假设你正在构建一个COM到.NET包装器的DLL,因为旧的Win32客户端不理解.NET,对吗? – 2011-03-31 16:30:38

回答

7

也许你忘了在接口和类声明中使用[Guid]属性。他们必须匹配IDL中用于旧C++项目的IID和CLSID。或者这些功能不再以相同的顺序。或者他们没有相同的DISPID,以防客户端代码迟到使用它们。

避免这种情况的最好方法是在.NET项目中添加对旧类型库的引用,以便在代码中使用旧接口。您仍然需要获得实现接口的类的[Guid],以便它具有正确的CLSID。

您可以使用OleView.exe工具View + Type Library来比较旧的和新的类型库。复制/粘贴生成的IDL并对其进行分析。您从Regasm.exe/tlb中获得新的类型库。任何不匹配都可能(也可能会)成为问题。