代码之家  ›  专栏  ›  技术社区  ›  Len Holgate

.NET相当于静态库?

  •  5
  • Len Holgate  · 技术社区  · 15 年前

    我在托管代码(主要是C++/CLI)中构建了两个版本,一个“正常用户”版本和一个“PRO”版本。

    两个版本之间的核心代码是相同的这一事实给我带来了一些麻烦,因为我希望将生成的工具打包为单个程序集(dll),并且不希望在两个版本的工具的项目中包含公共代码的.cpp文件。我宁愿有一个用于公共代码的项目和一个用于工具的每个版本的项目,并且让工具的每个版本依赖于公共代码,并根据需要将其链接。

    在非托管C++中,我将把公共代码放在静态库中,并将工具的两个版本链接到它。我似乎无法用C++来完成这个工作。似乎我被迫将公共代码构建到一个dll程序集中,这导致了比我想要的更多的dll。

    所以,总的来说,我不知道如何在一个项目中构建公共代码,并将其与每个最终产品项目链接,以生成两个包含公共代码的单个DLL程序集。

    我可能做了一些错误的事情,但是我尝试着用netmodules和其他什么工具来解决这个问题,但是我无法让它工作。最后,我让它工作的唯一方法是告诉链接器链接公共代码程序集的构建产品,而不是链接有效但有点黑客风格的结果。

    不管怎样,有人对我应该如何解决这个问题有什么建议吗?

    编辑: 我想我应该提到的事实是,所生成的程序集不是100%个托管代码,它们包含了托管和非托管代码的混合,很可能是用C++/CLI产生的程序集非常常见。

    7 回复  |  直到 14 年前
        1
  •  6
  •   PaulMcG    15 年前

    如果您对所有的DLL都感到恼火,请下载 ILMerge . 我使用它将多个DLL捆绑到一个便于客户使用的.exe中。

        2
  •  2
  •   Nils    15 年前

    如前所述,ilmerge是一种方式,个人来说,如果你捆绑了一些exe和许多dll的话,我很喜欢。 Netz .

        3
  •  1
  •   Community holdenweb    7 年前

    你可以使用 modules . 您可以使用程序集链接器将它们链接到程序集, al.exe .

        4
  •  1
  •   Erik Philips    15 年前

    如果我理解正确的话,您有一个包含两个项目的解决方案。一个项目用于“普通”用户,一个项目用于“专业”用户。Visual Studio允许您从另一个项目向另一个文件源添加“链接”。如果您的“pro”版本具有真正的核心代码文件,并且在您的“normal”版本中添加了现有的->请在“pro”项目中查找该文件,然后单击“添加”按钮旁边的向下箭头,然后选择“添加为链接”。现在您有了两个项目之间完全相同的单个文件。

        5
  •  0
  •   Blindy    15 年前

    这是.NET编译过程的缺点,不能将静态库和头文件放在一起,所有内容都保存在一个大的dll文件中,共享信息的唯一方法是构建一个公共dll并从其他程序集引用它,或者复制每个dll中的代码(可能通过复制/在项目之间链接.cs文件)。

    请注意,第二种方法将声明不同的类型,即使它们具有相同的名称。这会用远程处理之类的东西(或者任何需要在进程之间强制转换到特定共享接口的东西)来咬你的屁股。

        6
  •  0
  •   AngryHacker    15 年前

    Remotesoft Salamander 会把你挂起来的。它基本上是一个本机编译器和链接器。

        7
  •  0
  •   Nils    15 年前

    使用Mono时(或Cygwin是一个选项) mkbundle 也可能是一个有效的选择。