costura.fody用于引用另一个dll的dll

时间:2017-11-02 15:57:20

标签: c# .net dll libgit2sharp fody-costura

我有一个使用LibGit2Sharp编写的小exe,我正在尝试使用Costura.Fody来嵌入所有内容,所以我只有一个exe来分发(实际上,有两个配置文件也是,但没关系。

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

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

add .dll's to project explicitely

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库的按钮时:

  

...&#39; LibGit2Sharp.Core.NativeMethods&#39;抛出一个例外。 ---&GT;   System.DllNotFoundException:无法加载DLL&#39; git2-1196807&#39;:   找不到指定的模块。 (HRESULT的例外情况:   0x8007007E)...

我做过的一些事情给了我一个LibGet2Sharp dll无法访问的错误(而不是关于git2-1196807的错误),但我认为这只是在我让Fody瘫痪了。

我很感激你能给予的任何建议;这令我感到困惑。如果我将git2-1196807.dll文件放在已部署的位置&#34;。\ lib \ win32 \ x86&#34;和64位等效,然后它运行正常,但这使得使用costura.fody失败了。

想法?

2 个答案:

答案 0 :(得分:5)

this question的帮助下解决这个问题,并且必须添加一些我自己的工作。

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

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

enter image description here

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

enter image description here

最后,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名称之外。

答案 1 :(得分:0)

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