【发布时间】: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\
。