2010-11-04 72 views
2

我有两个.NET程序集注册为COM +组件,我正在测试它们从常规控制台应用程序测试工具;COM +组件调用其他COM +组件 - “无法加载类型”

Dim objFirst As New MyFirstComponent() 'COM+ initialisation 
Dim RC As Boolean = objFirst.GetValue() 

方法调用成功执行。这是MyFirstComponent的定义;

<ProgId("MyFirstComponent")> _ 
<Guid("...")> _ 
<ClassInterface(ClassInterfaceType.None)> _ 
<Transaction(TransactionOption.Supported)> _ 
Public Class MyFirstComponent 
    Inherits ServicedComponent 
    Implements IMyFirstComponent 

    Public Function GetValue() As Boolean Implements IMyFirstComponent.GetValue 
     Dim objSecond As New MySecondComponent() 'COM+ initialisation 
     Dim RC As Boolean = objSecond.GetValue() 
     Return RC 
    End Function 

End Class 

在MySecondComponent被初始化的时候,我得到一个RemotingException,并带有以下消息;

无法加载类型 'MySecondComponent',...,版本= ...,文化=中性公钥= ...”

所有组件都强命名了。我无法弄清楚为什么我可以成功地调用第一个组件的方法调用,但是当它试图随后加载第二个组件时,它无法解析该类型。作为一个旁注,如果我在我的测试工具中运行“GetValue()”主体中的代码,它会按预期执行。这个问题似乎只会在事物进入调用其他COM +组件的COM +组件的领域时才会出现。

更新

我觉得我现在的问题缩小英寸看起来,COM +持续存在一些进程,并且在运行我的客户端之前,必须手动关闭组件服务窗口中的COM +应用程序。之前的问题是,每当我改变某些东西时(例如将程序集添加到GAC),我都在测试客户端,由于某种原因COM +仍然认为找不到程序集。关闭应用程序,将所需的程序集添加到GAC并再次运行客户端可按预期工作。

这对我的小概念客户端证明来说很好。所以我回到我的真实代码并尝试了一下,但现在我又遇到了另一个奇怪的问题。我的COM +应用程序现在似乎无法找到他们正常的项目引用。我并不是真的想要加入他们引用GAC的所有内容,所以我现在试图弄清楚为什么我的普通非COM +引用没有得到解决。

+0

寻找InnerException。我猜测它找不到组件。 – 2010-11-04 16:12:34

+0

@Hans Passant:嗨Hans - InnerException不幸的是。我很高兴地相信它找不到组件,但我为什么不能找到该组件。我尝试将所有内容都添加到GAC,但没有喜悦。我也尝试注册regasm/codebase,但仍然是相同的错误。 – 2010-11-04 17:26:02

+0

恩,那不是那么。没有更好的信息没有线索。 – 2010-11-04 17:31:14

回答

5

我终于找到了上述问题的解决方案。我在这里自己回答这个问题,以拯救任何其他人,我试图让这个工作的痛苦。

  • 转到组件服务> COM +应用> YourComApplication

  • 提出来供YourComApplication属性窗口,然后转到激活选项卡。

  • 在“应用程序根目录”下,提供DLL驻留的路径。

  • 创建一个“”应用程序。清单“文件为您的COM +应用程序,并把它放在同一目录上面的一个范例文件看起来是这样的。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
manifestVersion="1.0"> 
</assembly> 
  • 这最后一步就是我以前错过这个解决方案将没有它的工作

此外,请确保您有为电子商务单独的目录你的COM +应用程序。这种方法将允许您有多个基于.NET程序集的COM +应用程序互相调用,而不必在GAC中进行任何操作。

+1

非常感谢!是的,我正在开发一个COM +应用程序在这个时代... – 2015-11-10 13:42:54

+0

哈,很高兴有帮助:) – 2015-11-20 10:00:26

1

你有没有研究过使用regasm注册程序集来访问COM。我不确定,但它可能与注册程序集时传递的/ codebase参数有关。这是值得一试的。希望这可以帮助。

+0

嗨@Jeremy E,我试过regasm,但它仍然无法找到加载类型的原因。 (还是)感谢你的建议。 – 2010-11-05 09:29:17

0

虽然您明显解决了包含在答案中的步骤的问题,但如果您的PowerShell版本与您尝试加载的程序集不兼容,也会出现此问题。

例如,您可能有一个针对.NET Framework 4.5.1的程序集,但运行的PowerShell版本是2.0版。如果将版本升级到4.0或5.0,则应该没有问题。