COM库中的TypeLoadException

时间:2011-09-30 20:28:14

标签: .net

我有一个类库,它有一个类MessageGroupInfo,它包含一些字符串和bool属性。没办法。我使用这个类将信息传递给另一个类MessageGrouper的构造函数。

这些由COM可见类库使用,它是另一个应用程序的加载项。加载项程序集和类库都使用.NET 4客户端目标。

当我调用使用MessageGrouper(以及MessageGroupInfo)的方法时,我得到一个TypeLoadException。它找不到MessageGroupInfo。我知道它已经解决并加载了类库,因为该程序集中的其他代码工作得很好。

我设置了一个快速的WinForm应用程序,看它是否有问题,但它运行正常。

此问题最初发生在64位win7盒子上。它在XP 32bit盒子上运行良好。

那么,这可能是64位的东西还是COM-64位的东西?有什么设置我不见了?否则,加载项运行良好,在类库中调用许多其他方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

感谢Hans,我发现问题是.NET引用了类库的旧DLL。调试器正在查看正确的(即Intellisense可以找到该方法),但该方法实际上并不在被引用的DLL中。我还没弄明白为什么发生这种情况,但修复方法是找到DLL的所有实例,删除它们并重建。 BAM。有效。 :d

感谢汉斯指出我正确的方向!

答案 1 :(得分:0)

这可能是一个64位的东西。默认情况下,.Net应用程序是独立于体系结构的,这意味着它们将在64位计算机上作为64位进程启动。 64位进程无法加载32位DLL,反之亦然。

我自己遇到了一个包含WebBrowser控件的应用程序,由于这个原因无法实例化Flash播放器。

为了使事情进一步复杂化,对于32位和64位COM类,有两个单独的注册表键树;如果您的库是独立于体系结构的,那么当您的本机应用程序在32位树中查找时,它可能会在64位树中注册。

将项目的平台目标设置更改为x86,以确保您的代码始终被视为32位。 (在Visual Studio中,您可以在项目属性“构建”选项卡上找到它。)即使使用该设置,我也不确定您在尝试构建处理详细信息的安装程序时会遇到什么样的疯狂32对64位注册。 Visual Studio的安装程序项目可能会也可能不会做正确的事情。