我有两个.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 = ...'
所有程序集也都有很强的名称。我无法弄清楚为什么我可以成功触发对第一个组件的方法调用,但是当它试图随后加载第二个组件本身时,它无法解析该类型。
作为旁注,如果我在测试工具中运行“GetValue()”主体的代码,它会按预期执行。一旦事物进入调用其他COM +组件的COM +组件领域,问题似乎才会出现。
更新
我想我现在正在缩小这个问题。似乎COM +正在持续进行某些操作,我必须在运行客户端之前从组件服务窗口手动关闭COM +应用程序。之前的问题是我每次更改内容时都在测试客户端(比如将程序集添加到GAC),并且出于某种原因,COM +仍然认为无法找到程序集。关闭应用程序,将所需的程序集添加到GAC并再次运行客户端按预期工作。
这对我的小概念证明客户端来说很好。所以我回到我的真实代码并试了一下,但现在我又遇到了另一个奇怪的问题。我的COM +应用程序似乎无法找到他们正常的项目引用。我真的不想继续添加他们引用GAC的所有内容,所以我现在试图找出为什么我的普通,非COM +引用没有得到解决。
答案 0 :(得分:5)
我终于找到了解决上述问题的方法。我自己在这里回答这个问题是为了拯救其他人我试图让它发挥作用的痛苦。
转到组件服务&gt; COM +应用程序&gt; YourComApplication
打开YourComApplication的属性窗口,然后转到“激活”选项卡。
在“应用程序根目录”下,提供DLL所在的路径。
为您的COM +应用程序创建“ application.manifest ”文件,并将其放在与上面相同的目录中。示例文件如下所示;
<?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 :(得分:1)
您是否考虑过使用regasm注册程序集以便与COM进行访问。我不确定,但它可能与注册程序集时传递的/ codebase参数有关。值得一试。希望这会有所帮助。
答案 2 :(得分:0)
虽然您明显解决了答案中包含的步骤的问题,但如果您的PowerShell版本与您尝试加载的程序集不兼容,也会出现此问题。
例如,您可能有一个针对.NET framework 4.5.1的程序集,但您运行的PowerShell版本是2.0版。如果将版本升级到4.0或5.0,则应该没有问题。