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

C# 使.NET COM对象可通过LAN访问?,c#,com,dcom,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)] [Cla

对不起,我对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}";
    }
}
这很好,但是我需要能够从LAN上的其他计算机访问此COM对象。当我尝试在同一台计算机上执行此操作时,我会遇到一个错误:

' Unable to create ActiveXObject
set obj = CreateObject("MyTest", "localhost")
WScript.Echo(obj.Test)
所以问题是,我如何注册我的COM DLL,以便从局域网上的其他计算机调用它?我是否可以使COM DLL始终托管在dllhost.exe进程(COM代理)中,而不是加载到调用方进程中?

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

另外,您还可以创建一个新的COM+服务器应用程序并添加DLL


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

不太清楚您为什么喜欢通过使用Regasm.exe/codebase以编程方式执行此操作。这显然是一个鸡和蛋的问题。但只要您这样做,“path_to_the_dll”就必须是存储在服务器上的dll的路径。比如
\\servername\sharename\foo\bar.dll
。代码片段太简短,无法提供有关如何确保路径正确的任何具体建议。一定要支持君主制。exe@HansPassant我认为进行RegisterAssembly调用实际上与调用“regasm.exe/codebase”是一样的。我尝试用regasm.exe注册我的COM DLL。regasm说类型已经注册,但是上面的VBScript代码不起作用。没有创建HKCR\CLSID\类。我使用oleview添加了DllSurrogate,调用CreateObject(“MyTest”、“localhost”)效果很好,MyTest类托管在dllhost.exe进程内。但是,当我尝试从远程计算机访问此类时,CreateObject失败,HRESULT 0x800A01AD。我怎样才能修好它?要从远程计算机访问该类,是否还需要执行其他操作?可能是您的安全设置有问题。检查客户端和服务器计算机上的DCOM和防火墙设置。如果有疑问,请尝试将IP地址而不是服务器名称作为第二个参数传递给
CreateObject
。还要注意,您需要在客户端上注册类型库。谢谢,我在客户端上注册了相同的类型,并在服务器上禁用了Brandmauer。现在我得到了“拒绝访问CreateObject”错误。在服务器上,我检查了组件服务中是否签入了“在此计算机上启用分布式COM”。我还需要检查什么才能使其正常工作?是的,您需要通过组件服务中的DCOM配置设置适当的远程权限。请查看链接了解详细信息。
set obj = CreateObject("MyTest")
WScript.Echo(obj.Test)
' Unable to create ActiveXObject
set obj = CreateObject("MyTest", "localhost")
WScript.Echo(obj.Test)