如何使C#COM DLL等效于ATL COM C++

本文关键字:ATL COM C++ 何使 C#COM DLL | 更新日期: 2023-09-27 18:01:01

嗨,我正在尝试使用C#和Visual Studio 2005 开发COM

首先我做了界面"CSharpServer.cs">

<code>
    using System;
    using System.Runtime.InteropServices;
    namespace CSharpServer
    {
       [ComVisible(true)]
       [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")]
       public interface IManagedInterface
       {
          int PrintHi();
       }
       [ComVisible(true)]
       [Guid("C6659361-1625-4746-931C-36014B146679")]
       public class InterfaceImplementation : IManagedInterface
       {
          public int PrintHi()
          {
             Console.WriteLine("Hello!");
             return 33;
          }
       }
    }
</code>

我编译了。输出是:csharp_server.dll。之后,我做了:regasm csharp_server.dll/tlb/codebase
输出为:

RegAsm:警告RA0000:正在向注册未签名的程序集/代码库can ca使用程序集干扰可能安装于同一台计算机。/codebase开关仅用于带有签名组件。请为程序集提供一个强名称并重新注册它类型注册成功。。。

1ª问题:我必须签名?如何

2ª问题:由作者删除

3ª问题:我只能通过visual studio运行"regasm"命令提示符。很快,如果我使用C#开发COM组件并分发到客户端,它还必须安装visual studio?如果客户刚刚安装了Delphi,并且想要使用该组件,它将不得不安装visual studio?

4ª在Visual Studio C#中,我试图添加COM引用,但说:

对"csharp_server"的引用可能不能添加。ActiveX类型库"xxx''csharp_server.tlb"已导出来自。NET程序集,不能作为参考添加。添加引用到。NET程序集。但是在".NET参考"中。我看不到组件"csharp_server">

我做错了什么或忘记了什么?

提前谢谢。

如何使C#COM DLL等效于ATL COM C++

#1阅读sn.exe。生成一个强名称密钥文件,然后在解决方案资源管理器中右键单击项目并编辑其属性。选择"签名"选项卡并添加密钥文件。如果你的公司有一个密钥文件,你可以延迟对程序集进行签名,然后将其传递给私钥的保管人(你将无法访问它,因为它被极度锁定,因为如果它是公共的,任何人都可以模仿你的公司对应用程序进行签名。(别忘了在解决方案资源管理器中打开"属性"文件夹并编辑名称/版本等。您的大会。

#2你是说删除DLL后可以使用它吗?很难相信。

#3安装程序包(如Installshield(有注册规定。NET程序集。或者,您可以使用regasm/regfile生成一个.reg,该.reg可以合并到目标注册表中。我真的建议你:1(使用商业工具来构建你的安装程序,或者2(成为MSI技术的光辉之神。使用SDK工具编写正确的安装程序是非常困难的,甚至使用Wix也是如此。

#据我所知,4没有变通办法。我猜Microsoft认为,让托管程序集通过第二个托管程序集实现的COM接口包装程序之上的托管包装程序集访问另一个托管程序集中是不正当的。也许他们不希望它成为绕过私人/全球集会约束规则的常见方式。

无论如何,也许您可以编辑类型库,使其"欺骗"托管包装生成器(TlbImp.exe(,使其认为它是一个本地COM类型库,但它真的值得吗?大多数具有公共API的商业应用程序都有从COM和托管客户端使用应用程序API的说明,其中一个或另一个是包装器,具体取决于应用程序的实现。多年来,这种技术一直适用于许多供应商,没有出现任何问题。