嗨,我正在尝试使用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。之后,我做了:重新加气csharp_server.dll / tlb / codebase
输出为:
...
RegAsm:警告RA0000:向未注册的程序集注册
/ codebase可以
使用您的程序集来干扰可能
安装在
同一台计算机。 / codebase开关仅应使用
带签名
组件。请给您的大会起好名字,然后重新注册
它。
类型注册成功...
1ª问题:我必须签字吗?怎么样?
2ª问题:由作者删除。
3ª问题:我只能在Visual Studio中运行“重新加气”命令提示符。很快,如果我使用C#开发COM组件并将其分发给客户端,那么还必须安装Visual Studio吗?如果客户刚刚安装了Delphi,并且想使用组件,就必须安装Visual Studio吗?
4ª在Visual Studio C#中,我尝试添加COM引用,但说:
对“ csharp_server”的引用可以
未添加。 ActiveX类型库
'xxx \ csharp_server.tlb'已导出
来自.NET程序集,不能
添加为参考。添加参考
改为.NET程序集。
但是在“ .NET参考”中。我看不到组件“ csharp_server”。
我做错了什么或忘记了什么?
提前致谢。
最佳答案
#1在sn.exe上阅读。生成一个强名称密钥文件,然后在解决方案资源管理器中右键单击您的项目并编辑其属性。选择“签名”选项卡并添加密钥文件。如果您的公司有密钥文件,则可以延迟对程序集进行签名,然后将其传递给私钥的持有者(您将无法访问它,因为它已被高度锁定,因为如果它是公开的,则任何人都可以签名)应用会冒充您的公司。)不要忘记在解决方案资源管理器中打开“属性”文件夹并编辑名称/版本/等。您的程序集。
#2您是说删除DLL后就可以使用它吗?很难相信。
#3安装程序包(例如Installshield)具有根据需要注册.NET程序集的规定。或者,您可以使用regasm / regfile生成一个.reg,可以将其合并到目标注册表中。我真的建议:1)使用商业工具来构建安装程序,或者2)作为MSI技术的光辉之神。使用SDK工具甚至Wix编写正确的安装程序都是非常困难的。
据我所知,#4没有解决方法。我猜微软认为让托管程序集通过第二托管程序集实现的COM接口包装程序之上的托管程序集程序集访问另一个托管程序集是不对的。也许他们不希望它成为解决私有/全局程序集绑定规则的常用方法。
无论如何,也许您可以编辑类型库,以便它“欺骗”托管包装器生成器(TlbImp.exe),使其认为它是本机COM类型库,但这真的值得吗?大多数具有公共API的商业应用程序都有从COM和受管客户端使用应用程序API的说明,一个或另一个是包装程序,具体取决于应用程序的实现。多年来,这种技术已经为许多供应商所采用,而且没有出现任何问题。