抱歉,我对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)中,而不是加载到调用者进程中?
答案 0 :(得分:0)
您可以指定DllSurrogate来完成此任务。使用oleview设置相应的注册表项(有关详细信息,请参阅this answer)。
作为替代方案,您还可以创建一个新的COM +服务器应用程序并添加您的DLL。
请注意,您可能需要调整DCOM / COM +安全设置才能远程访问您的班级。