【发布时间】:2011-09-28 06:09:05
【问题描述】:
我的第一个项目,类型类库:
using System;
using System.Collections.Generic;
using System.Text;
namespace Project2
{
public class Class1
{
public int num = 33;
}
}
使用命令行sn -k keyPair.snk 我生成了一个密钥对并添加了keypair.snk 进行签名。
第二个项目类型类库:
using System;
using System.Runtime.InteropServices;
using Project2;
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()
{
Class1 obj = new Class1(); // Using first project
return obj.num; // return public int num = 33;
}
}
}
我添加了 keypair.snk 来签名。
使用“使用 Project2;”在 CSharpServer 项目中,我点击了“添加/现有项目..” Project2.csproj,之后我点击了“添加参考../项目”。
我编译的时候,生成了两个dll,如何用两个项目生成一个dll?
我阅读了有关 ILMerge 的信息。似乎它结合了两个dll。但是我有源代码,难道没有办法在Visual Studio中加入吗?
我读到this CodeProject article 说“您显然可以将所有源文件添加到一个项目中”但是如果我的第一个项目有 1000 个类?
我试过 ilmerge: "C:\Program Files\Microsoft\ILMerge\ilmerge" /target:library /out:project.dll CSharpServer.dll Project2.dll
生成一个文件project.dll
问题: 如果我这样做:regasm project.dll /tlb /codebase
... RegAsm:警告 RA0000:注册未签名的程序集 /codebase 可以 使用您的程序集来干扰其他可能的应用程序 安装在 同一台电脑。 /codebase 开关仅供使用 带签名的 组件。请给您的程序集起一个强名称并重新注册 它。 类型注册成功...
如何签署这个合并的 dll? CSharpServer.dll 是带有接口的组件 COM,需要通过 regasm 注册。 Project2.dll 不需要。 细节, 我只想注册 CSharpServer.dll 但 project.dll 包含(CSharpServer.dll + Project2.dll)。现在呢?
我尝试签名:sn -R project.dll keyPair.snk。输出:
Microsoft (R) .NET Framework 强名称实用程序版本 2.0.50727.42 版权所有 (c) 微软公司。保留所有权利。
project.dll 不代表强命名程序集
该标志适用于:
要签名,必须提取公钥:
sn -p keyPair.snk publickey.snk
指定和匹配公钥: "C:\Program Files\Microsoft\ILMerge\ilmerge" /keyfile:publickey.snk /target:library /out:project.dll CSharpServer.dll Project2.dll
使用命令签名后:
sn -R project.dll keyPair.snk
现在的问题是: 注册这个 dll 并结合 regasm。就像regasm只有界面?有什么影响呢?
提前致谢。
【问题讨论】:
-
你为什么不只做一个项目?
-
我正在模拟 C# COM 组件的库的使用。所以我不能放在同一个项目中。
-
从 regasm.exe 得到的消息只是一个警告。这意味着:“你要调用 DLL Hell,你确定吗?”。你在你的开发机器上。运行 ilmerge 后,您必须手动签署合并的程序集。使用 sn.exe。合并的程序集包含来自 project2.dll 的类,并且您现在有 1001 个类而不是程序集中的 1000 个类是不相关的。请务必在要使其可见的每个界面上明确使用 [ComVisible]。
-
你是说,当我尝试注册时,只注册了Visible接口?如果我 regasm project.dll (CSharpServer.dll + Project2.dll),如果我 regasm CSharpServer.dll 是同样的事情,因为 Project2.dll 没有接口?
-
@Hans Passant。我尝试签名:sn -R project.dll keyPair.snk。输出:project.dll 不代表强命名程序集。
标签: c# assemblies