问题标签 [fody-costura]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
375 浏览

.net-core - 为什么 .Net Core 的 PublishSingleFile 进行自提取而不是资源嵌入程序集?

对我来说,合并 .Net 二进制文件以便我只剩下一个可执行文件始终是一个既有趣又重要的功能。根据我的阅读,有以下三种方法:

  1. 合并

    • 真正合并程序集。相当于创建一个 .csproj 并拉入所有源代码。
  2. 福迪·科斯图拉

    • 将程序集分开,但仅将它们的文件作为资源包含并相应地弯曲分辨率。
  3. .Net Core 3+ PublishSingleFile / Warp

    • 据我了解,这些方法是相似的。在第一次执行时将文件提取到临时目录,然后正常运行它们。

虽然主题非常相关,有时确实重叠,但我不打算混淆单个文件、独立部署和修剪——我主要考虑的是单个文件部分。

我认为这三种方法中的任何一种都有其自身的优点和缺点,没有一种是“最佳”方式。

  1. 合并

    • + 似乎是“合并”最自然的选择
    • + 不需要运行时加载,如果一切都在那里并且工作正常,那就是它;一旦图像在内存中,我们就完成了
    • - 每次加载所有内容可能会导致启动性能下降,这与桌面应用程序相关
    • - 内部结构发生了很大变化,程序集名称发生了变化,可能库内部结构更多地涉及应用程序代码等;我猜这可能会导致难以调试的错误,在最坏的情况下会出现在生产中。它只是改变了开发人员可能认为理所当然的事情(即他们的程序集的名称)。
    • - 可能不是概念性的,但不支持 .Net Core => dealbreaker
  2. 福迪·科斯图拉

    • + 为依赖项启用压缩
    • + 更少的内部变化,可能导致更少的不可预见的情况
    • + 可能需要操作系统来加载完整的图像,但不需要 CLR 来一次加载库,因此可能会提高启动性能
    • - 每次都需要解压缩依赖;可能是 CPU 方面的性能损失,可能是 IO 方面的性能优势
  3. 自提取

    • + 也压缩了
    • + 一旦代码被提取并运行,唯一的区别就是它的位置。因此,lib 开发人员甚至仍然可以在磁盘等上找到他们的程序集,我猜这使得运行时差异最小。
    • - 第一次启动可能需要一些明显的时间,并且是相当 IO 密集型的,一种安装。
    • + 后续运行的行为类似于非单文件部署,与其他两个相比具有各自的(劣势)优势。
    • - 带有一些不平凡的问题。何时更新提取的文件?谁删除了提取文件的旧版本?如果磁盘已满/...怎么办?
    • - 执行不再无副作用。
    • - 所需磁盘空间的两倍以上。

在我个人显然不是详尽且非科学的经验中,(3)有时有一些粗糙的边缘并表现出奇怪的行为,而(2)在我一直使用它的几年里工作得非常好(尽管比较框架与核心)。但这可能是由于(3)的实施非常新或我的误解。

我发布这个问题的目的是(a)更好地理解这一点,(b)理解微软为什么选择(3)。所以,会很棒

  • 如果我错过了三者之间的差异以指出它们(请随时编辑问题以将内容保存在一个地方)。
  • 如果我做出错误的假设来指出它们。
  • 如果总体上有更多选择,或者我对其中一个概念有误以指出它们
  • 如果有关于推理的内容,为什么微软选择(3)作为更好的方式(这可能会加深我对利弊的理解)来为我指明正确的方向。

虽然我知道很难与框架功能竞争,但我有点难过Costura 处于维护模式,因为我认为它比框架方法具有优势,使第二个选项成为可行的选择。因此,我问这个问题的原因之一是了解(3)是否有任何严重的优势,而不是(2)我忽略了。

0 投票
0 回答
172 浏览

embed - 制作单个 exe cefsharp 应用程序 - 嵌入 libcef.dll - costura.fody

在找到costura.fody之前,我已经尝试了很多东西,我希望这将是创建我正在做的cefsharp应用程序的单个文件 exe 的解决方案。

因此,帮助文件将您要嵌入解决方案资源管理器的文件的本地副本设置为 true。做到了。

所以当我这样做时,exe变得有点大,但我注意到它的大小甚至没有接近覆盖libcef.dll所以我怀疑这个文件没有嵌入。

我通过重命名输出文件夹中的 dll 对此进行了测试,是的,我无法运行该应用程序。

我真的很想这样做,但我有点放弃了。我正在努力使用AppDomain.CurrentDomain.AssemblyResolve来利用该事件,但它从未被调用过。即使在静态构造函数中定义它以确保它在其他任何事情之前启动。

谁能帮我解决这个问题?

亲切的问候安德拉

0 投票
1 回答
289 浏览

c# - 将 dll 与 Costura、Microsoft.Data.Sqlite 合并会引发错误并且无法添加迁移等

我有一个至少有 50 个 dll 的项目。而且我不会在根文件夹中使用 .exe 应用程序。我正在使用 Fody/Costura 来解决这个问题。

但是...我想将整个数据库重写为sqlite。最终用户不需要配置的东西,对我来说是一个简单的解决方案。

但是 Costura 什么时候打开它不能让我使用 instance.Database.Migrate() 和许多其他命令。

https://gyazo.com/4c2adaf6d279c562cee44b096f123ae5

当我从 App.xaml.cs 中删除该上下文并尝试添加迁移时,它写道:

您的启动项目“x”没有引用 Microsoft.EntityFrameworkCore.Design。此包是 Entity Framework Core Tools 工作所必需的。确保您的启动项目正确,安装包,然后重试。

当我关闭 Costura 时,一切正常。但是dll位于根文件夹中:(所以...

  • 有什么方法可以隐藏 dll 并在项目中拥有 sqlite 数据库?
  • 或者还有其他替代无服务器数据库的方法吗?什么适用于 Costura?
  • 我对根文件夹中的一些 dll 没有问题,但不希望它们 50。

编辑:当我将其称为嵌入式资源时,与图片中的问题相同。

EmbeddedAssembly.Load("Project.Microsoft.Data.Sqlite.dll", "Microsoft.Data.Sqlite.dll");

0 投票
1 回答
254 浏览

c# - 将单个项目控制台应用程序作为可执行文件运行时找不到 App.Config

当使用 costura.fody 运行打包到单个 .exe 的控制台应用程序时,我似乎无法访问我的 app.config 导致错误

System.InvalidOperationException:在应用程序配置文件中找不到名为“volumeEntities”的连接字符串。在 System.Data.Entity.Internal.LazyInternalConnection.get_ConnectionHasModel()

当我在我的 nunit 测试项目中进行测试时,我在其中添加的 app.config 包含连接字符串有效。

我将 app.config 添加到解决方案中的唯一其他项目中。它包含正确的连接字符串 在属性中,启动对象设置为“Uploader.Program”

我是否错过了将项目设置为启动而不是程序类的某种方式?如何让可执行文件找到 app.config?

0 投票
0 回答
406 浏览

c# - 使用 Fody Costura 创建包含 CefSharp 的类库

我正在尝试构建一个包含 CefSharp 作为单个 .dll 文件的 WinForms 类库。

我通过 NuGet 安装了 CefSharp 81.3.100.0 和 Costura.Fody。

编译后的 .dll 文件作为现有 WinForms 应用程序的插件工作。当我尝试访问在应用程序中使用 CefSharp 的表单时,我确实收到了错误消息:

{"找不到文件或程序集 \"CefSharp.WinForms, Version=81.3.100.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138" 或其引用。系统找不到给定的文件。

有没有人有想法,如何解决这个问题?

提前致谢。

问候拉尔斯

0 投票
0 回答
36 浏览

c# - 使外部库的属性可见,而不导入该库

由于我无法在此解释的原因,我需要创建一个可在 .Net Framework 应用程序中使用的单个 dll 文件。在该库中,我使用了最终用户应用程序不能(直接)使用/导入的第 3 方库。我使用 Fody/Costura 将库捆绑到一个 dll 文件中。

在我自己的库中,我有一个继承自 3rd 方库中的类的类。我可以在应用程序中毫无问题地使用该类,但是当我使用基类的属性时会出现编译错误。我可以通过在子类中创建一个“代理”来避免这些编译错误。

如果没有这些代理属性,有什么方法可以使这项工作?

0 投票
1 回答
261 浏览

c# - Fody 和 Assembly.GetExecutingAssembly().Location 返回空字符串

我正在调用我Assembly.GetExecutingAssembly().Location的解决方案的其中一个 dll。当我尝试使用 Fody ( https://www.nuget.org/packages/Fody/ ) 将我的二进制文件打包成一个二进制文件时,我注意到这个调用开始返回空字符串而不是执行程序集的位置。这应该被认为是一个错误吗?使用 Fody 时有没有办法获取这些信息?如果我从解决方案的主项目进行调用,它似乎工作正常。

这是我的主要方法:

然后GetLocation在 dll 中定义该方法,如下所示:

没有 Fody 的控制台中的输出如下所示:

添加 Fody 后,它看起来像这样:

0 投票
3 回答
1912 浏览

exe - C# - 为什么 costura 和 fody 对我不起作用?

(使用了翻译器。)我正在使用 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

0 投票
0 回答
49 浏览

c# - 正在使用的外部 JSON.net 库(有时)

我正在开发 SSRS(SQL Server Reporting Services)交付扩展。其中一部分需要我对库文件进行强命名,以便在 rssrvpolicy.conf 中使用 FullTrust 权限加载它。

在部分代码中,我需要将一小部分 JSON 序列化为一个对象。所以我为此使用了 Newtonsoft Json.NET (13.0.1),效果很好。

为了将所有这些都放在一个易于交付的单个文件中(大多数情况下[配置文件也是]),我使用 Costura.Fody 将所有引用的库嵌入到单个 DLL 中。效果很好。

该库从各种 SSRS 进程中调用(我在日志中将 RSPortal 和 ReportingServicesService 视为父进程)。 这就是事情变得奇怪的地方。 当被 RSPortal 调用时,一切正常。但是,当由 ReportingServicesService 运行时,如果它尝试调用利用 Json.NET 的方法之一,我会收到如下错误:

问题是,我使用的是 Json.NET 13,而不是 12。SSRS bin 文件夹中包含一个 Newtonsoft.Json.dll (版本 12.0),该文件夹包含在默认 SSRS 安装中供他们自己使用,所以看起来这就是我在 ReportingServicesService 下执行时使用 Json.NET 时使用的内容。有什么办法可以“强制”我的代码使用嵌入式 Json.NET 13 库?

编辑 - 经过一些修补后,我确认它是正在使用的库文件......

目前,我可以通过在我的 AssemblyInfo.cs 中包含以下内容来抑制错误,并让它在某些情况下使用他们的 Json.NET 库,因为它工作正常。

我不确定这样做的安全隐患,我也想知道如何让它使用我的嵌入式库版本。

我试过包括这是我的 DeliveryExtension.dll.config 文件,但它似乎没有任何区别。

有人有任何想法/建议吗?

0 投票
1 回答
366 浏览

c# - 无法让 costura.fody 将 dll 嵌入 exe

我尝试将类库的 dll 嵌入到我的 exe 中。我使用 Visual Studio 2019 和 .net 5。我在一个解决方案中创建了两个项目,一个是类库 (dll),第二个是针对 .net core 5 的控制台应用程序。我选择控制台应用程序作为启动项目。类库仅包含打印出 hello 的公共静态 hello 函数。我将类库的项目引用到控制台应用程序中,然后在控制台应用程序中我只调用了 ClassNamespace.library.hello 函数。当我编译它时,它工作正常。然后我按照他们的自述文件中的描述安装了costura.fody,我通过以下方式将其添加到控制台项目中:

然后我将 FodyWeavers.xml 放入项目文件夹

之后我重建了项目,它建立了,exe正在运行,但是当我从输出目录中删除.dll时,.exe没有运行。