【问题标题】:Consume all source code (non-compiled) from one project into another (PDFSharp)将一个项目中的所有源代码(未编译)消耗到另一个项目中(PDFSharp)
【发布时间】:2021-04-16 16:00:44
【问题描述】:

正如标题所说,我想将 PDFSharp 的所有源代码都用到我自己的项目中。但是让我解释一下我为什么会出现这种情况,所以如果我可以做其他事情,也许还有其他选择。

目标:将我的项目编译成单个 .exe 文件以供使用。没有安装程序。 问题:它使用 PDFSharp.dll 导致我出现问题。

我想要做的是使用 ILMerge 创建 .exe。我过去曾成功地将其用于其他项目。

我认为 ILMerge 需要引用 PDFSharp 使用的其他程序集的问题。第一个是 Microsoft.ApplicationInsights。所以为了绕过这个,我通过 Nuget 将 Microsoft.ApplicationInsights 安装到我的项目中。然后从项目中删除了实际引用,但在我的 ILMerge 命令中引用了该库,如下所示:

/lib:"C:\<path to assembly>\Microsoft.ApplicationInsights.2.16.0\lib\net46"

这确实有效。除了,现在它要求另一个库,我得到这个错误:

Unresolved assembly reference not allowed: GdPicture.NET.11.

这看起来像一个付费图书馆,也许下载试用版可以让我通过这个。我还没试过。我换了个档次,因为我觉得我可能会尝试引用无穷无尽的程序集。

然后我尝试获取 PDFSharp 源代码,并在这里找到了 1.32 版: https://sourceforge.net/projects/pdfsharp/files/pdfsharp/PDFsharp%201.32/

我在我的解决方案文件中添加了对这个项目的引用,所以现在我有一个包含 2 个项目的解决方案。太好了。

然后我尝试将源文件链接到我的项目中。如何做到这一点在这里: https://jeremybytes.blogspot.com/2019/07/linking-files-in-visual-studio.html#:~:text=To%20link%20files%2C%20use%20the,CLICK%20THE%20%22Add%22%20BUTTON。 这似乎可行,但是我添加的每个文件都需要另一个文件,该文件引用另一个文件等。它似乎无穷无尽。所以这让我想到了将整个源代码消耗到我的项目中,我还没有看到一个好的方法来做到这一点。我无法添加对项目的引用,因为它只是引用了已编译的 dll,而 iLMerge 无法合并。

我还尝试将 PDFSharp 的 .csproj 文件中的标签更新为“模块”以创建一个 .netmodule 文件。这会在 obj 目录中创建文件,但会引发错误:

\PDFsharp\code\PdfSharp\obj\Release\PdfSharp.netmodule' is not an assembly

感谢任何帮助。谢谢。

更新:我颠倒了所有内容并添加了 PdfSharp 参考 - 回到我所在的位置并将我的项目更改为模块并构建它创建了一个 .netmodule 文件。然后使用程序集链接器从该文件创建一个 .exe。在 VS Dev 提示符下使用此命令有效。

al MyModule.netmodule /target:exe /out:MyProgram.exe /main:MyNamespace.MyClass.Main

这创建了 .exe,但在没有任何其他支持文件的情况下运行时会产生文件未找到错误:

System.IO.FileNotFoundException: Could not load file or assembly 'MyModule.netmodule' or one of its dependencies. The system cannot find the file specified. 

模块应该在 exe 中,这很有趣吗?

【问题讨论】:

  • 将项目文件更改为模块绝对行不通。是的,您需要添加的文件可能几乎是无穷无尽的。您最好的选择可能是在文本编辑器中编辑 csproj 文件并将所有“
  • 我会试试 Russ - 谢谢。
  • @Russ - 我能够将所有源文件添加到我的项目中。它构建,它运行。 PDF 功能有效。但是,当我使用 iLMerge 时,它​​仍然抱怨缺少引用:不允许未解析的程序集引用:Microsoft.ApplicationInsights。这在我可以找到的源文件中的任何地方都没有引用...
  • 由于您试图获得没有 DLL 的单个可执行文件,您可以获取 Microsoft.ApplicationInsights 的源代码,或者在 iLMerge 中找到使用 Microsoft.ApplicationInsights 的代码并查看如果您可以将其重新编码为替代方案 - 或者重新编码以使其不使用 Microsoft.ApplicationInsights。
  • 呃!一直以来,问题来自不同的 dll,我以为是 PDFSharp 而不是!好浪费一整天:(

标签: c# pdfsharp ilmerge


【解决方案1】:

我现在有这个工作,所以我只想把我的结果放在这里,因为它已经发布了。

我最初的问题是我错误地认为是 PDFSharp.dll 导致了问题,但它实际上是我引用的另一组第 3 方 dll。

我尝试了几个小时让 iLMerge 工作,唯一的成功是它会踢出单个 .exe 文件,但会出现运行时错误。

我遇到的错误:

错误:不允许使用未解析的程序集引用:Custom.Assembly。

解决方案:尽可能引用程序集。如果你有很多,你可以使用 /lib:"C:\folderpath" 开关来引用一个文件夹。

错误:不允许使用未解析的程序集引用:ADotNetFramework.dll。

解决方案:您可以引用所需的 .Net Framework 路径,iLMerge 将在其中搜索缺失的引用。示例:/targetplatform:"v4,C:.NETFramework\v4.8"

错误: 程序集“xyz.dll”未正确合并。它仍然在目标程序集中列为外部引用。

解决方案:您可以使用 /close 开关克服此错误。但是,我认为我什至不应该得到这个错误,因为 'xyz.dll' 是一个要合并的引用 dll。

另外 - 使用 /log 开关,它非常有助于准确了解 iLMerge 正在做什么并找出您的问题。示例:/log:mylog.txt

这让我看到 iLMerge 在第 3 方程序集中查找重复的命名空间并自动重命名它们。这是我日志中的一个示例:

将程序集“My.Assembly.Name”合并到目标程序集中。 重复类型名称:修改类型 'f__AnonymousType02' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.&lt;&gt;f__AnonymousType02' 的名称 重复类型名称:修改类型 'f__AnonymousType12' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.&lt;&gt;f__AnonymousType12' 的名称 重复类型名称:将类型“”的名称(从程序集“My.Assembly.Name”)修改为“My.Assembly.Name”。

最后 - 我找到的解决方案是不使用 iLMerge。我找到了这个答案:https://stackoverflow.com/a/40786196/2596309 其中使用了 Costura.Fody 我安装了 nuget 包:

Install-Package Costura.Fody -Version 4.1.0

清理并构建了我的解决方案,它创建了一个我测试过的 .exe 文件,它可以正常工作。从字面上看,我花了 3 天的时间来解决这个问题,结果花了 3 分钟......

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2013-05-21
    相关资源
    最近更新 更多