8

我有一个我写过的小 exe,它使用LibGit2Sharp并试图用来Costura.Fody嵌入所有内容,所以我只有一个 exe 可以分发(实际上,也有两个配置文件,但没关系)。

问题似乎是对LibGet2Sharp.dll有相当坚定的参考git2-1196807.dll,我似乎无法弄清楚如何以前者可以使用的方式嵌入后者。我已经尝试了几件事,但我认为我最好的尝试是:

所有这些 .dll 都从解决方案的packages文件夹中复制并设置为Build Action = Embedded Resourceand Copy to Output Directory = Do Not Copy

将 .dll 明确添加到项目中

LibGit2Sharp 参考设置为Copy Local = false,我尝试了 FodyWeavers.xml 中的简单路线:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <Costura>
  </Costura>
</Weavers>

更复杂的是:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <Costura>
    <Unmanaged64Assemblies>
      Costura64\LibGit2Sharp
      Costura64\git2-1196807
    </Unmanaged64Assemblies>
    <Unmanaged32Assemblies>
      Costura32\LibGit2Sharp
      Costura32\git2-1196807
    </Unmanaged32Assemblies>
  </Costura>
</Weavers>

但是,我总是得到一个错误,不是在打开 exe 时,而是当我单击第一次使用 git 库的按钮时:

...'LibGit2Sharp.Core.NativeMethods' 抛出异常。---> System.DllNotFoundException:无法加载 DLL 'git2-1196807':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)...

我所做的一些事情给了我一个错误,即LibGet2Sharpdll 无法访问(而不是关于 的错误git2-1196807),但我认为那只是我削弱 Fody 的时候。

我将不胜感激您能提供的任何建议;这让我很困惑。如果我将git2-1196807.dll文件放在部署位置“.\lib\win32\x86”和 64 位等效文件中,那么它运行良好,但这违背了使用 costura.fody 的意义。

想法?

4

2 回答 2

10

在这个问题的一些帮助下弄清楚了这一点,并且不得不添加我自己的一些工作。

本质上,您需要在项目中创建一对名为 Costura32 和 Costura64 的文件夹,并将适当版本的 dll 放入其中,并将它们设置为“嵌入式资源”。然后编织者可以在构建解决方案时将它们包含在 exe 中。

就我而言,我使用的是依赖 git2-15e1193.dll 的 LibGit2Sharp dll,因此我将其作为解决方案的一部分:

在此处输入图像描述

对于每个 dll,我将 Build Action 设置为 Embedded Resource:

在此处输入图像描述

最后,FodyWeavers.xml 是:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <costura IncludeDebugSymbls='false'>
    <Unmanaged32Assemblies>
      git2-15e1193
    </Unmanaged32Assemblies>
    <Unmanaged64Assemblies>
      git2-15e1193
    </Unmanaged64Assemblies>
  </costura>
</Weavers>

确保将 .dll 从 FodyWeavers.xml 文件中的 dll 名称中删除。

于 2018-04-03T16:36:49.340 回答
0

如果 LibGit2Sharp 是一个普通的 AnyCPU .net 引用,那么只需将它作为项目中的引用就足够了,不要将它嵌入到 Costura32/Costura64 目录中。这些目录适用于通过 LoadLibrary 等加载的普通 Win32 样式的 dll。

于 2017-11-02T17:36:16.750 回答