使.NET COM对象可通过LAN访问?

时间:2018-02-01 10:37:21

标签: c# com dcom

抱歉,我对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 Surrogate)中,而不是加载到调用者进程中?

1 个答案:

答案 0 :(得分:0)

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

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

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