我有两个.NET程序集,它们注册为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‘、.、Version=.、Culture=neutral、PublicKeyToken=.’类型。
所有程序集也都有强名称。我无法确定为什么我可以成功地向第一个组件发出方法调用,但是当它随后尝试加载第二个组件本身时,它无法解析类型。
作为一个sidenote,如果我从我的测试工具中的"GetValue()“主体运行代码,它将按预期执行。只有在COM+组件调用其他COM+组件的领域中,问题才会出现。
更新
我认为我正在缩小这个问题的范围。看起来,COM+正在持久化,在针对它运行客户端之前,我不得不从Component窗口手动关闭COM+应用程序。以前的问题是,每次更改东西(比如将程序集添加到GAC)时,我都在测试客户端,出于某种原因,COM+仍然认为无法找到程序集。关闭应用程序,将所需的程序集添加到GAC中,并再次运行客户端,一切如愿以偿。
这对于我小小的概念客户证明来说是不错的。所以我回到我的真正的代码,并尝试了它,但现在我发现了另一个奇怪的问题。我的COM+应用程序现在似乎无法找到它们的正常项目引用。我真的不想把他们引用的所有东西都添加到GAC,所以我现在想弄清楚为什么我的非COM+引用没有被解决。
发布于 2010-11-10 15:02:50
我终于找到了解决上述问题的办法。我自己在这里回答这个问题,是为了让其他人免于痛苦,因为我一直在努力让这件事发挥作用。
YourComApplication
另外,确保为每个COM+应用程序都有一个单独的目录。这种方法将允许基于COM+程序集的多个.NET应用程序相互调用,而无需在GAC中进行任何操作。
发布于 2010-11-04 15:01:04
您是否考虑过使用regasm注册程序集以便使用COM访问。我不确定,但这可能与注册程序集时传递的/codebase参数有关。值得一试。希望这能有所帮助。
发布于 2016-05-28 23:40:48
尽管您显然解决了答案中包含的步骤的问题,但如果您的PowerShell版本与要加载的程序集不兼容,则也会出现此问题。
例如,您可能有一个针对.NET框架4.5.1的程序集,但是正在运行的PowerShell版本是Version2.0。如果您将版本升级到4.0或5.0,您应该没有问题。
https://stackoverflow.com/questions/4097815
复制相似问题