costura.fody for a dll that references another dll
Asked Answered
B

2

9

I have a small exe I've written that uses LibGit2Sharp and am trying to use Costura.Fody to embed everything so I only have a single exe to distribute (actually, there are two config files as well, but that's ok).

The problem seems to be that LibGet2Sharp.dll has a fairly firm reference to git2-1196807.dll, and I can't seem to figure out how to embed the latter in the way the former can use. I've tried several things, but I think my best attempt is:

all of these .dll's are copied from the solution's packages folder and set to Build Action = Embedded Resource and Copy to Output Directory = Do Not Copy.

add .dll's to project explicitely

The LibGit2Sharp reference is set to Copy Local = false, and I have tried the simple route in FodyWeavers.xml:

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

and a more complex is:

<?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>

However, I always get an error, not when opening the exe, but when I click the button that first uses the git library:

...'LibGit2Sharp.Core.NativeMethods' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'git2-1196807': The specified module could not be found. (Exception from HRESULT: 0x8007007E)...

A few things I've done have given me an error that the LibGet2Sharp dll is inaccessible (and not the error about git2-1196807), but I think that's just when I've crippled Fody.

I would appreciate any advice you can give; this has me baffled. If I put the git2-1196807.dll file in the deployed location ".\lib\win32\x86" and the 64bit equivalent, then it runs fine, but that defeats the point in using costura.fody.

thoughts?

Burge answered 2/11, 2017 at 15:57 Comment(0)
B
11

Figured this out with some help from this question and had to add some work of my own.

Essentially, you need to create a pair of folders in the project, called Costura32 and Costura64 and put the appropriate version of the dll in there, and set them to 'Embedded resource'. Then the weaver can include them in the exe when building the solution.

In my case, I was using the LibGit2Sharp dll, which relies on git2-15e1193.dll, so I have this as part of my solution:

enter image description here

and for each of those dll's, I have the Build Action set to Embedded Resource:

enter image description here

Finally, the FodyWeavers.xml is:

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

Make sure to leave the .dll off the dll names in the FodyWeavers.xml file.

Burge answered 3/4, 2018 at 16:36 Comment(2)
This is the final answer in the whole internet (I spent a whole night)... the default custura fody doesn't work embedding the dll. And after I used your solution, the DLL finally has been embedded into my executable ...Ding
glad it helped!Burge
D
0

If LibGit2Sharp is a normal AnyCPU .net reference, then simply having it as a reference in the project is enough, don't embed it in the Costura32/Costura64 directories. Those directories are for normal Win32 style dlls that are loaded thru LoadLibrary and such.

Drabble answered 2/11, 2017 at 17:36 Comment(1)
this was my first try, I initially just added costura.fody to the solution and tried that as-is, but got this error RE the git2-1196807.dll, so I started trying to fix itBurge

© 2022 - 2024 — McMap. All rights reserved.