将基本的 .NET 程序集暴露给 COM 应该相当简单 - 我从未尝试过 COM 类项目模板,所以这是我过去管理它的方式:
使用 C# 或 VB 创建一个新的(沼泽标准).NET 类库。定义一个 COM 接口(用您自己的 GUID 替换):
[ComVisible(true)]
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")]
public interface IComm
{
string GetMyGroups();
}
现在定义一个实现该接口的类(同样,用您自己的 GUID 替换):
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")]
[ProgId("Test.Comm.1")]
public class Comm : IComm
{
public string GetMyGroups()
{
var comm = new CommunicatorAPI.MessengerClass();
var groups = comm.MyGroups as IMessengerGroups;
return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray());
}
}
这个类的 Prog ID 属性是您将用来从 ASP 实例化您的组件的属性。
强命名程序集(项目属性 -> “签名”选项卡 -> “签署程序集” -> 使用下拉菜单创建新的强名称密钥文件)
现在,构建程序集,并使用 Regasm 注册 - 如果您不想在 GAC 中注册(我建议您这样做,因为不是 GACing 会使部署更简单),请务必使用 -Codebase参数(这只是添加一个 reg 条目,告诉客户端在哪里可以找到程序集) - 例如:
regasm ClassLibrary2.dll /codebase "S:\Testing\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll"
现在您应该能够实例化组件,并在其上调用方法 - 例如(在 javascript 中):
var a = new ActiveXObject("Test.Comm.1");
alert(a.GetMyGroups());
在部署方面,Regasm 和 Regsvr32 做的重要工作是将各种设置写入注册表,以便客户端可以找到 COM 组件(基于 Prog ID,或 COM Class ID)。您需要做的就是弄清楚当您在本地计算机上运行 Regasm 时正在写入哪些 COM 设置,并将这些设置写入服务器上的注册表。您可以使用ProcMon 来监控 Regasm 运行时写入注册表的内容。
一般来说,您可以期望看到这样的内容写入注册表:
[HKEY_CLASSES_ROOT\Test.Comm.1]
@="ClassLibrary2.Comm"
[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID]
@="{00585504-90C8-4760-A359-67CAF08FFED1}"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}]
@="ClassLibrary2.Comm"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0]
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId]
@="Test.Comm.1"
希望这会有所帮助:)