Как я могу использовать C ++ DLL в C # - PullRequest
2 голосов
/ 26 августа 2010

Мне нравится импорт c ++ dll в моем приложении на c # Как я могу это сделать? Какую концепцию мне нужно использовать для этого?

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

Вам нужно посмотреть на различные виды взаимодействия. Самый простой - P / Invoke . Тогда это COM Interop . И, наконец, вы можете использовать Управляемый C ++

2 голосов
/ 26 августа 2010

Доступ к источнику библиотеки C ++

Самый простой способ - использовать C ++ Interop для создания оболочки как сборки в смешанном режиме.Это позволяет использовать прагмы, управляемые и неуправляемые, для переключения между собственным и управляемым кодом.Таким образом, вы можете красиво обернуть ваш класс C ++ управляемой оболочкой C ++ и вызывать его из (конечно) управляемого C #.

Имейте в виду, что это не будет работать в Mono.

У вас нет доступа к исходному тексту библиотеки C ++, но вы немного знаете C ++?

Вы можете написать небольшую управляемую оболочку в управляемом C ++ для вызова неуправляемой библиотеки C ++ из-зауникальной способности C ++ вызывать COM изначально.

Это делается с помощью пользовательских оболочек, вызываемых во время выполнения, или CRCW .Затем вы можете вызвать управляемую оболочку прямо из C #, используя собственные типы .Net и все.

Преимущества этого (как указано в MSDN):

Код взаимодействиявстроен в приложение, поэтому нет зависимости от отдельной сборки.Кроме того, открытый управляемый интерфейс настроен так, чтобы быть более похожим на .NET.Например, метод RenderFile принимает System.String вместо char *.Управляемая версия интерфейса COM называется Custom Runtime Callable Wrapper (CRCW).

У вас нет доступа к источнику библиотеки C ++ и вы не знаете C ++?

Тогда вы застряли с C ++ COM Interop , что немного более грязно.Вам нужно будет создать оболочку, используя Tlbimp.exe .

Это грязно, потому что:

  1. Типы, которые не имеют прямого соответствия в управляемом кодепредоставляются как типы указателей IntPtr (довольно сложно обрабатывать в C #)
  2. Получающиеся сборки будут очень большими, поскольку создаются интерфейсы для всего в библиотеке (а не только того, что вам нужно).
  3. Вам придется развернуть дополнительную сборку с вашим приложением и управлять версиями и т. Д. *
1 голос
/ 26 августа 2010

предположим, это DLL, которая компилируется с MinGW.в C-sharp вы можете следовать этому коду:

using System.Runtime.InteropServices;
using System;

class call_dll {

  [StructLayout(LayoutKind.Sequential, Pack=1)]
  private struct STRUCT_DLL {
    public Int32  count_int;
    public IntPtr ints;
  }

  [DllImport("mingw_dll.dll")]
  private static extern int func_dll(
      int an_int,
      [MarshalAs(UnmanagedType.LPArray)] byte[] string_filled_in_dll,
      ref STRUCT_DLL s
   );

  public static void Main() {

    byte[] string_filled_in_dll = new byte[21];


    STRUCT_DLL struct_dll = new STRUCT_DLL();
    struct_dll.count_int = 5;
    int[]  ia = new int[5];
    ia[0] = 2; ia[1] = 3; ia[2] = 5; ia[3] = 8; ia[4] = 13;

    GCHandle gch    = GCHandle.Alloc(ia);
    struct_dll.ints = Marshal.UnsafeAddrOfPinnedArrayElement(ia, 0);

    int ret=func_dll(5,string_filled_in_dll, ref struct_dll);

    Console.WriteLine("Return Value: " + ret);
    Console.WriteLine("String filled in DLL: " + System.Text.Encoding.ASCII.GetString(string_filled_in_dll));

  }
}
0 голосов
/ 26 августа 2010

Это - это концепция, которую вам нужно использовать:)

...