将一个项目的所有源代码 (non-compiled) 消耗到另一个项目 (PDFSharp)

Consume all source code (non-compiled) from one project into another (PDFSharp)

正如标题所说,我想将 PDFSharp 的所有源代码都用到我自己的项目中。但是让我解释一下我为什么来到这个场景,所以如果我能做点什么,也许还有其他选择。

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

我想做的是使用 ILMerge 创建 .exe。我过去曾在其他项目中成功使用过它。

我认为问题是 ILMerge 需要引用 PDFSharp 使用的其他程序集。第一个是 Microsoft.ApplicationInsights。所以为了 by-pass 这个,我通过 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 个项目的解决方案。太好了。

然后我尝试将 link 源文件添加到我的项目中。如何做到这一点是在这里: 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 文件。然后使用程序集 linker 从该文件创建一个 .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 中,对吗?

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

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

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

我遇到的错误:

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

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

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

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

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

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

此外 - 使用 /log 开关,它对于准确查看 iLMerge 正在做什么和找出您的问题非常有帮助。示例:/log:mylog.txt

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

Merging assembly 'My.Assembly.Name' into target assembly. Duplicate type name: modifying name of the type '<>f__AnonymousType02' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.<>f__AnonymousType02' Duplicate type name: modifying name of the type '<>f__AnonymousType12' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.<>f__AnonymousType12' Duplicate type name: modifying name of the type '' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.

最后 - 我找到的解决方案是不使用 iLMerge。我找到了这个答案: 使用了 Costura.Fody 我安装了 nuget 包:

Install-Package Costura.Fody -Version 4.1.0

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