Встраивать библиотеки C ++ в библиотеки .Net - PullRequest
6 голосов
/ 31 июля 2010

В моих сборках .Net мне пришлось бы использовать некоторые нативные (C ++) библиотеки. Обычно нам нужно скопировать DLL-библиотеки C ++ в папку bin и использовать PInvoke для ее вызова. Чтобы сэкономить на распространении, я хочу встроить C ++ в мою .Net dll direct, чтобы количество распределенных сборок было меньше.

Есть идеи, как это сделать?

Ответы [ 2 ]

4 голосов
/ 31 июля 2010

Вы бы встроили свои собственные DLL в качестве ресурсов.

Затем во время выполнения вам придется извлечь эти собственные DLL во временную папку;у вас не обязательно есть доступ на запись к папке приложения при запуске приложения: например, Windows Vista или Windows 7 и UAC.Как следствие, вы будете использовать этот вид кода для загрузки их по определенному пути:

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);
    }
  }
}
0 голосов
/ 31 июля 2010

Вы можете вставлять свои библиотеки в качестве ресурсов.

Во время выполнения извлеките их в ту же папку, что и ваш exe-файл, и используйте P / Invoke для вызова методов внутри них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...