【问题标题】:COM+ component calling other COM+ components - "Cannot load type"COM+ 组件调用其他 COM+ 组件 - “无法加载类型”
【发布时间】:2010-11-04 14:44:48
【问题描述】:

我有两个注册为 COM+ 组件的 .NET 程序集,我正在通过常规控制台应用程序测试工具对其进行测试;

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+ 引用没有得到解决。

【问题讨论】:

  • 寻找 InnerException。我猜它找不到程序集。
  • @Hans Passant:嗨,Hans - 不幸的是,InnerException 为空。我很高兴相信它找不到程序集,但我很困惑为什么找不到。我也尝试将所有内容添加到 GAC,但没有任何乐趣。我也试过用 regasm /codebase 注册,但还是一样的错误。
  • 嗯,不是那样的。没有更好的信息就没有线索。

标签: .net remoting com+


【解决方案1】:

我终于找到了解决上述问题的方法。我在这里自己回答这个问题是为了避免其他人在尝试让它发挥作用时所经历的痛苦。

  • 转到组件服务 > 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>
  • 这最后一步是我之前错过的,没有它,这个解决方案将无法工作

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

【讨论】:

  • 哈,很高兴能帮上忙 :)
【解决方案2】:

您是否考虑过使用 regasm 注册程序集以通过 COM 访问。我不确定,但这可能与注册程序集时传递的 /codebase 参数有关。值得一试。希望这会有所帮助。

【讨论】:

  • 嗨@Jeremy E,我试过regasm,但由于某种原因它仍然找不到加载类型。不过感谢您的建议。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 2010-10-30
    • 2013-04-25
    • 2013-04-27
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多