我想将我的应用程序作为单个.exe文件分发。
为此,我正在使用Costura.Fody嵌入我的应用程序的依赖项。但是,依赖项本身具有本机依赖项(PdfiumViewerNUGet 包)。最初,它们位于x86/x64文件夹中,但我将它们分别移动到costura32/costura64并将它们设置为Embedded resource.
当我构建项目时,“输出”选项卡显示PdfiumViewer.dll已嵌入。但是当我运行该程序时,出现异常PdfiumViewer.NativeMethods。
我可以实现单个.exe文件吗?(我在.NET 3.5)
由于本机依赖项具有相同的名称(pdfium.dll),我相信这个问题是相关的。
我无法让 Fody.Costura 在 .NET Core 2.1 或 .NET Standard 2.0 库中运行。wiki 和开放问题似乎没有直接回答这个问题:与经典 .NET Framework 项目(.exe 或 .dll)相比,必须采取哪些不同的做法。
出于测试目的,我创建了 4 个项目:
我将 Fody(最新 5.1)和 Costura(最新 4.0)添加到所有项目中。
然后我为所有项目创建了完全相同的 FodyWeaver.xml。
我使所有项目都依赖于 Newtonsoft.Json(根据 Nuget 添加它,并在使用 Newtonsoft.Json 的每个项目中创建一个类)。
我构建了它们并检查了输出 -> Newtonsoft.Json 不在预期的输出目录中。但是,当使用 ILSpy 查看创建的 .dll 文件时,仅 .NET Framework 项目中的二进制文件包含一个 Resources 文件夹,其中包含 Newtonsoft.Json.Dll。
从我在 wiki 中读到的内容来看,不应该有进一步的设置。这些问题并不是说 .NET Core 和 Standard 不受支持,即使正在进行改进等。有人知道如何让这里的东西正常工作吗?对我不认识的文档有任何提示吗?
.NET Core 和 Standard 项目的最终 Dll 应包含 Newtonsoft.Json.dll
如果我在 FodyWeavers.xml …
有没有办法禁用 Fody Costura?我需要执行一些故障排除,并且我想知道 Fody Costura 不是问题的一部分。我宁愿禁用它,而不是删除 nuget,这将是一种解决方案。
<Costura/>由于我不使用任何其他编织器,因此从 Fody 配置中删除会出现以下错误:
Fody: No configured weavers. It is possible you have not installed a weaver or have installed a fody weaver nuget into a project type that does not support install.ps1. You may need to add that weaver to FodyWeavers.xml manually. eg. <Weavers><WeaverName/></Weavers>. see https://github.com/Fody/Fody/wiki/SampleUsage
我用 Costura.Fody。
有一个应用程序 Test.exe,它以这种方式运行进程internalTest.exe:
ProcessStartInfo prcInfo = new ProcessStartInfo(strpath)
{
CreateNoWindow = false,
UseShellExecute = true,
Verb = "runas",
WindowStyle = ProcessWindowStyle.Normal
};
var p = Process.Start(prcInfo);
Run Code Online (Sandbox Code Playgroud)
现在我需要向用户提供2个exe文件。
是否可以嵌入internalTest.exe然后运行它?
我正在尝试使用 costura fody 将一堆 DLL 嵌入到我的 C# 可执行文件中,但我在使用 2 个 DLL 时遇到了一些问题。我正在使用 NAudio 库和 NAudio.Lame 库,虽然这两个 DLL 都完美编译到 exe 中,但 NAudio.Lame 包添加了 dll“libmp3lame.64.dll”和“libmp3lame.32.dll”,这是我的无法用exe编译。我尝试在 Costura 节点下的 FodyWeavers.xml 文件中添加以下内容:
<Unmanaged32Assemblies>
libmp3lame.32
</Unmanaged32Assemblies>
<Unmanaged64Assemblies>
libmp3lame.64
</Unmanaged64Assemblies>
Run Code Online (Sandbox Code Playgroud)
XML 不会更改 exe 的文件大小,因此我认为它什么也没做。
我还尝试将 DLL 的“构建操作”更改为“嵌入式资源”,虽然可执行文件大小显着增加,但如果我启动程序时没有将 DLL 与 exe 放在同一文件夹中,则会出现运行时 DLLNotFoundExeption。
编辑:我现在注意到我只需要 64 位 dll 即可让程序在我的计算机上运行,但我也无法仅添加该 dll
EDIT2:我尝试使用以下代码为 AssemblyResolve 设置事件:
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Client.libmp3lame.64.dll")) {
byte[] assemblyData = new byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData); …Run Code Online (Sandbox Code Playgroud) 我正在 vs2019 中创建一个 winform 应用程序,通过报告查看器创建报告并且它运行良好。但是,当我使用 Fody/Costura 嵌入 dll 时,报告查看器以某种方式给出了错误。
我也尝试手动嵌入dll,但仍然出现相同的错误。
错误消息出现在报告查看器中,
本地报告处理过程中发生错误。报告的定义无效。报告处理中发生意外错误。“Microsoft.Reporting.Services.ReportIntermediateFormat.Persistence.IntermediateFormatVersion”的类型初始值设定项引发异常。路径不是合法形式。
任何帮助将不胜感激。谢谢。
(使用翻译器。)我正在使用 Costura 和 Fody 制作一个 exe 文件。但是,如果缺少 dll 文件,则无法运行。我的 Visual Studio 中有一个警告。警告:
FodyPackageReference Fody: The package reference for Costura.Fody is missing the 'compile' part in the IncludeAssets setting; it's recommended to completely remove IncludeAssets
我尝试将类库的 dll 嵌入到我的 exe 中。我使用 Visual Studio 2019 和 .net 5。我在一个解决方案中创建了两个项目,一个是类库 (dll),第二个是针对 .net core 5 的控制台应用程序。我选择控制台应用程序作为启动项目。类库仅包含公共静态 hello 函数,该函数打印出 hello。我将类库的项目引用到控制台应用程序中,然后在控制台应用程序中我只调用了 ClassNamespace.library.hello 函数。当我编译它时,它工作正常。然后我按照自述文件中的描述安装了 costura.fody,我通过以下方式将其添加到控制台项目中:
PM> Install-Package Fody
PM> Install-Package Costura.Fody
Run Code Online (Sandbox Code Playgroud)
然后我将FodyWeavers.xml放入项目文件夹中
<Weavers>
<Costura/>
</Weavers>
Run Code Online (Sandbox Code Playgroud)
之后,我重建了项目,它构建了,并且 exe 正在运行,但是当我从输出目录中删除 .dll 时,.exe 没有运行。
我已经使用nuget包将costura.fody安装到我的项目中.我已经更新了FodyWeavers.xml文件:
<Costura
Unmanaged32Assemblies='dllname'
Unmanaged64Assemblies='dllname' />
Run Code Online (Sandbox Code Playgroud)
当我重建它并尝试在单独的PC上运行exe而没有dll它不起作用.我错过了什么吗?我还需要添加其他内容吗?我也尝试过以下方法:
<IncludeAssemblies>
dllname
</IncludeAssemblies>
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助.
最近我遇到了一个用于修改 .NET 程序集的 NuGet 包,特别是,有一个用于 Fody 包的 Costura NuGet“插件”,它在 C# 编译器完成后合并程序集。
我找不到对 .csproj 文件(除了 NuGet 导入)的任何修改,这些修改显示了在构建程序集后执行的任务。
我想知道 Fody 如何能够在构建后运行代码而不会在任何地方进行任何明显的配置更改。
我正在寻找一个免费工具将我的所有wpf应用程序的程序集合并到一个程序集中.通常,我使用ILMerge,但不幸的是,它不支持合并WPF程序集.有没有可以实现这一目标的工具?
商业工具对我来说不是一个选项,因为该应用程序是一个开源项目.
最
诚挚的问候,Oliver Hanappi