2010-03-15 76 views
2

我有一个.Net 2 C#应用程序我正在开发使用VB 6生成的COM DLL。 VB DLL经常更新,任何我的应用程序崩溃与System.Runtime.InteropServices.COMException(0x80040154)。我使用的COM DLL部分不会改变,但版本(和CLSID)将会改变。在C#中COM的松散耦合或如何避免COMException 0x80040154

该引用的“特定版本”选项为false。 WrapperTool是tlbimp。

如何告诉我的应用程序不要担心DLL中的更改?有什么办法检查我正在使用的功能吗?

+0

我在其他地方使用过这个代码: //返回最顶层窗口的引用。 [DllImport(“user32.dll”,CharSet = CharSet.Auto,ExactSpelling = true)] public static extern IntPtr GetActiveWindow(); 这是唯一的答案? – 2010-03-16 03:33:29

回答

2

这是最常见的COM错误之一,“类未注册”。它从VB6开始,它有一个控制二进制兼容性的选项。我忘记了看起来像什么,它太长了。如果你不控制这个,VB6将创建一个具有不同CLSID值的新COM服务器。这需要使用Regsvr32.exe重新注册DLL。并用Tlbimp.exe重新生成互操作库。后一步可能是你错过的那一步。

请注意,使用不同的CLSID值是COM的硬性要求,当公共接口更改时,必须执行必须的。但是只有实施方式发生变化时才可以。

+0

谢谢。较新的COM DLL已注册。我也发现CLSID没有改变。 – 2010-03-16 03:49:22

+0

错误告诉了另一个故事。 – 2010-03-16 09:23:12

+0

对不起Bugz先生。我错过了我总是错过的一个步骤,即Tlbimp.exe步骤。 IDE(SharpDevelop)在编译时必须调用它。 – 2010-03-17 22:23:00