使 .NET COM 对象可通过局域网访问



抱歉,我对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)

因此,问题是我如何以可从LAN上的其他计算机调用的方式注册我的COM DLL?是否可以使 COM DLL 始终托管在 dllhost.exe 进程(COM 代理项(中,而不是加载到调用方进程中?

您可以指定 Dll代理项来完成此任务。使用 oleview 设置相应的注册表项(有关更多详细信息,请参阅此答案(。

作为替代方法,还可以创建新的 COM+ 服务器应用程序并添加 DLL。

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

最新更新