COM +组件调用其他COM +组件 - "无法加载类型"

Chr*_*ney 2 .net remoting com+

我有两个.NET程序集注册为COM +组件,我正在从常规控制台应用程序测试工具中测试它们;

Dim objFirst As New MyFirstComponent() 'COM+ initialisation
Dim RC As Boolean = objFirst.GetValue()
Run Code Online (Sandbox Code Playgroud)

方法调用成功执行.这是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
Run Code Online (Sandbox Code Playgroud)

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

无法加载类型'MySecondComponent',...,Version = ...,Culture = neutral,PublicKeyToken = ...'

所有程序集也都有很强的名称.我无法弄清楚为什么我可以成功触发对第一个组件的方法调用,但是当它试图随后加载第二个组件本身时,它无法解析该类型.

作为旁注,如果我在测试工具中运行"GetValue()"主体的代码,它会按预期执行.一旦事情进入调用其他COM +组件的COM +组件领域,问题似乎才会出现.

更新

我想我现在正在缩小这个问题.似乎COM +正在持续进行某些操作,我必须在运行客户端之前从组件服务窗口手动关闭COM +应用程序.之前的问题是我每次更改内容时都在测试客户端(比如将程序集添加到GAC),并且出于某种原因,COM +仍然认为无法找到程序集.关闭应用程序,将所需的程序集添加到GAC并再次运行客户端按预期工作.

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

Chr*_*ney 5

我终于找到了解决上述问题的方法.我自己在这里回答这个问题是为了拯救其他人我试图让它发挥作用的痛苦.

  • 转到组件服务> COM +应用程序> 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>
Run Code Online (Sandbox Code Playgroud)
  • 最后一步是我之前错过的,如果没有它,这个解决方案将无法运行.

此外,请确保每个COM +应用程序都有一个单独的目录.这种方法将允许您拥有基于.NET程序集的多个COM +应用程序,而无需在GAC中进行任何操作.