将一个简单的C#DLL转换成COM互操作组件
如何将C#DLL转换为VB6应用程序可以使用的COM互操作DLL?
这是我想在StackOverflowfind的答案,但不能。 事实certificate,将一个简单的C#DLL变成一个COM DLL相当容易。
创buildC#的DLL
使用C#类项目创build一个解决scheme。 这个类应该有一个属性/方法的接口和一个事件的接口。 按照MSDN – 示例COM类(C#编程指南)中所述,将GUID属性分配给类和接口。 另请参阅: MSDN – 如何:引发由COM接收器处理的事件 。
在“项目属性”>“应用程序”选项卡>“assembly信息”button中,选中“使assembly体可见”。 这使得COM类中的所有公共方法都可见。
在“项目属性”>“生成”选项卡>将“平台目标”设置为x86。
这就是所有你需要做的创buildDLL。 要调用该DLL,您需要注册它。
在您的开发机器上注册DLL
您可以通过以下方式之一注册DLL:
- 检查项目属性>构build选项卡>“注册COM互操作”。 这将自动注册DLL时,你build立它。
-
用RegAsm手动注册DLL。 这使您可以将DLL注册到您select的目录中,而不是在构build目录中。 这是我用的方法。
- 不要检查项目属性>构build选项卡>“注册COM互操作”
- 将该DLL复制到您要注册它的目录
-
使用pipe理员权限和types打开命令shell
RegAsm.exe -tlb -codebase mydll.dll
可以在“C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727”中findRegAsm.exe,而“mydll.dll”是您的DLL的名称;
tlb
意思是“创build一个types库”;codebase
意思是“将目录位置写入registry,假设它没有被放置在GAC中”。RegAsm将显示一个警告,该程序集应该是强命名的。 你可以忽略它。
此时,您应该能够在VB6中添加对COM DLL的引用,使用Intellisense查看它,并像运行常规COM DLL一样运行它。
使用InstallShield安装DLL
如果您使用InstallShield将DLL与其他应用程序一起安装,请执行以下操作。
在InstallShield中,将新组件添加到“组件”列表中。 请记住将组件与特征相关联。 将组件属性“.NET COM Interop”设置为“是”。
将.dll文件添加到组件的文件部分。 不要检查“自我注册”属性。 用鼠标右键单击该.dll文件并select“设置密钥文件”。
将.tlb文件添加到组件的文件部分。 检查“自我注册”属性。
目标PC上需要有正确的.Net Framework版本。
而已。
作为@Kieren John的扩展,Johnstone回答了一个关于类修改的实用代码示例,您需要:
从:
public class ApiCaller { public DellAsset GetDellAsset(string serviceTag, string apiKey) { .... } } public class DellAsset { public string CountryLookupCode { get; set; } public string CustomerNumber { get; set; } public bool IsDuplicate { get; set; } public string ItemClassCode { get; set; } public string LocalChannel { get; set; } public string MachineDescription { get; set; } public string OrderNumber { get; set; } public string ParentServiceTag { get; set; } public string ServiceTag { get; set; } public string ShipDate { get; set; } }
至:
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")] [ComVisible(true)] public interface IComClassApiCaller { IComClassDellAsset GetDellAsset(string serviceTag, string apiKey); } [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [ComVisible(true)] public interface IComClassApiCallerEvents { } [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IComClassApiCallerEvents))] [ComVisible(true)] [ProgId("ProgId.ApiCaller")] public class ApiCaller : IComClassApiCaller { public IComClassDellAsset GetDellAsset(string serviceTag, string apiKey) { ..... } } [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83E")] [ComVisible(true)] public interface IComClassDellAsset { string CountryLookupCode { get; set; } string CustomerNumber { get; set; } bool IsDuplicate { get; set; } string ItemClassCode { get; set; } string LocalChannel { get; set; } string MachineDescription { get; set; } string OrderNumber { get; set; } string ParentServiceTag { get; set; } string ServiceTag { get; set; } string ShipDate { get; set; } } [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA70"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [ComVisible(true)] public interface IComClassDellAssetEvents { } [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F937"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IComClassDellAssetEvents))] [ComVisible(true)] [ProgId("ProgId.DellAsset")] public class DellAsset : IComClassDellAsset { public string CountryLookupCode { get; set; } public string CustomerNumber { get; set; } public bool IsDuplicate { get; set; } public string ItemClassCode { get; set; } public string LocalChannel { get; set; } public string MachineDescription { get; set; } public string OrderNumber { get; set; } public string ParentServiceTag { get; set; } public string ServiceTag { get; set; } public string ShipDate { get; set; } }
希望这可以为你节省一些时间
微软有一个快速的如何在这里 。 但是,您需要注册该DLL。 为了使你的C#DLL更像一个简单的C DLL(C#非托pipe导出),使用这个方法,在这里详细描述。
COM Interop是.NET Framework公共语言运行库(CLR)中包含的一项技术,它使组件对象模型(COM)对象能够与.NET对象交互,反之亦然。 COM Interop旨在提供对现有COM组件的访问,而不需要修改原始组件,反之亦然。 更多: http : //www.writeulearn.com/com-interop-using-csharp/