将一个项目的所有源代码 (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__AnonymousType0
2'
Duplicate type name: modifying name of the type '<>f__AnonymousType12' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.<>f__AnonymousType1
2'
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 分钟...
正如标题所说,我想将 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__AnonymousType0
2' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.<>f__AnonymousType0
2' Duplicate type name: modifying name of the type '<>f__AnonymousType12' (from assembly 'My.Assembly.Name') to 'My.Assembly.Name.<>f__AnonymousType1
2' 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 分钟...