将一个基本的.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中保持部署更简单),请确保使用-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所做的重要工作是将各种设置写入注册表,以便客户端可以根据Prog ID或COM Class ID找到COM组件。您只需要确定在本地计算机上运行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"
希望这能帮助到你 :)