【问题标题】:Make .NET COM object accessable over the LAN?使 .NET COM 对象可通过 LAN 访问?
【发布时间】:2018-07-11 15:45:57
【问题描述】:

抱歉,我对 COM 很陌生,我正在努力解决问题。所以我在基于 C# 的 DLL 中创建了一些测试 COM 对象:

using System.Runtime.InteropServices;
using System.Diagnostics;
using System;

[ComVisible(true)]
[Guid("<interface_guid>")]
public interface IMyTest {
    string Test();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("<class_guid>")]
public class MyTest : IMyTest {
    public string Test() {
        var pro = Process.GetCurrentProcess();
        var mac = Environment.MachineName;

        return $"{mac} - {pro.Id} - {pro.ProcessName}";
    }
}

我正在使用以下代码注册这个基于 COM C# 的 DLL:

var asm = Assembly.LoadFrom("<path_to_the_dll>");
var reg = new RegistrationServices();

reg.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);

现在我可以像这样使用 VBScript 中的这个对象了:

set obj = CreateObject("MyTest")
WScript.Echo(obj.Test)

这很好用,但是我需要能够从 LAN 上的其他计算机访问此 COM 对象。当我尝试在同一台计算机上执行此操作时,我收到错误:

' Unable to create ActiveXObject
set obj = CreateObject("MyTest", "localhost")
WScript.Echo(obj.Test)

所以问题是我如何注册我的 COM DLL 以便从 LAN 上的其他计算机调用它?我可以让 COM DLL 始终托管在 dllhost.exe 进程(COM 代理)中,而不是加载到调用者进程中吗?

【问题讨论】:

  • 为什么您喜欢以编程方式执行此操作而不是使用 Regasm.exe /codebase,这并不是很明显。这有一个明显的先有鸡还是先有蛋的问题。但只要您这样做,“path_to_the_dll”就必须是存储在服务器上的 DLL 的路径。喜欢\\servername\sharename\foo\bar.dll。代码 sn-p 太简短,无法就如何确保路径正确提供任何具体建议。支持 Regasm.exe
  • @HansPassant 我认为进行 RegisterAssembly 调用实际上与调用“regasm.exe /codebase”相同。我尝试使用 regasm.exe 注册我的 COM DLL。 regasm 说类型已注册,但上面的 VBScript 代码不起作用。未创建 HKCR\CLSID\

标签: c# com dcom


【解决方案1】:

您可以指定DllSurrogate 来完成此任务。使用 oleview 设置适当的注册表项(有关详细信息,请参阅this 答案)。

您也可以创建一个新的 COM+ 服务器应用程序并添加您的 DLL。

请注意,您可能需要调整 DCOM / COM+ 安全设置才能远程访问您的班级。

【讨论】:

  • 我用 oleview 添加了 DllSurrogate,调用 CreateObject("MyTest", "localhost") 效果很好,MyTest 类托管在 dllhost.exe 进程中。但是,当我尝试从远程计算机访问此类时,CreateObject 失败并显示 HRESULT 0x800A01AD。我该如何解决?为了从远程机器访问课程,还有什么需要做的吗?
  • 您的安全设置可能有问题。检查客户端和服务器机器上的 DCOM 和防火墙设置。如果有疑问,请尝试将 IP 地址而不是服务器名称作为第二个参数传递给 CreateObject。另请注意,您需要在客户端上注册类型库。
  • 谢谢,我在客户端注册了相同的类型并在服务器上禁用了 Brandmauer。现在我收到“拒绝访问 CreateObject”错误。在服务器上,我检查了组件服务中的“在这台计算机上启用分布式 COM”。我还需要检查什么才能使其正常工作吗?
  • 是的,您需要通过组件服务中的 DCOM 配置设置适当的远程权限。详情请查看this 链接。
猜你喜欢
  • 2011-07-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多