开发者

Embed C++ Libraries into .Net Libraries

In my .Net assemblies I would have to make use of some native (C++ ) dlls. Usually we need to copy the C++ dlls into the bin folder and use PInvoke to call it. To save the distribution cost, I want to embed the C++ into my .Net dll direct, so th开发者_JS百科at the number of assemblies distributed would be less.

Any idea how to do this?


You would embed your native DLLs as resources.

Then at runtime, you would have to extract those native DLLs into a temporary folder; you don't necessarily have write access to the application folder when your application launches: think windows vista or windows 7 and UAC. As a consequence, you would use this kind of code to load them from a specific path:

public static class NativeMethods {

  [DllImport("kernel32")]
  private unsafe static extern void* LoadLibrary(string dllname);

  [DllImport("kernel32")]
  private unsafe static extern void FreeLibrary(void* handle);

  private sealed unsafe class LibraryUnloader
  {
    internal LibraryUnloader(void* handle)
    {
      this.handle = handle;
    }

    ~LibraryUnloader()
    {
      if (handle != null)
        FreeLibrary(handle);
    }

    private void* handle;

  } // LibraryUnloader


  private static readonly LibraryUnloader unloader;

  static NativeMethods()
  {
    string path;

    // set the path according to some logic
    path = "somewhere/in/a/temporary/directory/Foo.dll";    

    unsafe
    {
      void* handle = LoadLibrary(path);

      if (handle == null)
        throw new DllNotFoundException("unable to find the native Foo library: " + path);

      unloader = new LibraryUnloader(handle);
    }
  }
}


You can embed your dlls as resources.

At runtime, extract them to the same folder as your exe and use P/Invoke to call methods inside them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜