【问题标题】:How to generate a single dll from two C# projects? C# DLL COM + C# DLL如何从两个 C# 项目生成单个 dll? C# DLL COM + C# DLL
【发布时间】: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

我读了Giving a .NET SN

指定和匹配公钥: "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


【解决方案1】:

您必须通过在 Visual Studio 外部使用 csc.exe 编译代码并自己传递命令行参数(所有 .cs 文件)来做到这一点。

这会有点乏味,但可以做到。看here。

【讨论】:

  • 我会尝试这样做,但“对于所有.cs文件”。看起来很奇怪
  • 如果我的一个项目有超过 1000 个课程?有没有更简单的方法来做到这一点?
  • 谢谢。我尝试使用 ilmerge 进行合并,但我在签署 dll 时遇到问题。
  • 为了减轻添加对所有 cs 文件的引用的痛苦,您可以使用 Powershell 迭代您的项目目录并在字符串变量中构建参数,然后从您的 powershell 脚本执行 csc,提供该字符串作为您的参数。
  • @hermiod 是否有使用 Powershell 使用 Visual Studio 进行迭代的示例?我需要编辑预构建吗?
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2012-02-04
  • 2012-10-15
  • 2014-10-16
相关资源
最近更新 更多