Встраивание стандарта C ++ в приложение .NET - PullRequest
2 голосов
/ 15 июня 2011

Я хочу написать алгоритмическую библиотеку на стандартном, независимом от платформы C ++.

Могу ли я затем взять тот же код C ++ и скомпилировать его для .NET, чтобы приложение C # могло использовать библиотеку?Если нет, то как проще всего добиться такого взаимодействия?

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

Вы не можете напрямую взаимодействовать между C # и стандартным C ++.Однако вы можете использовать свою библиотеку C ++ внутри оболочки C ++ / CLI, которая делает эту функциональность доступной в управляемом коде .NET (и, следовательно, в C #).

Просто напишите оболочку в виде библиотеки C ++ / CLI, которая предоставляет.NET API и включает код из вашей стандартной библиотеки C ++ (но, к сожалению, это не может быть статически связан, насколько я знаю).

4 голосов
/ 15 июня 2011

У вас есть три способа сделать так, чтобы вашу библиотеку легко вызывать из управляемого кода:

  • напишите для него оболочку C ++ / CLI, содержащую public ref class - код C # будет вызывать методы этого класса, которые будут вызывать собственные методы вашей библиотеки
  • представляет функцию C-style из вашей библиотеки как DLL - код C # будет использовать P / Invoke для вызова функции
  • написать COM-компонент на C ++, который использует вашу библиотеку, и вызвать его из кода C #, добавив к нему COM-ссылку.

Этот третий, COM, я включил только для полноты. Это не будет моим первым выбором. Или мой третий. Одно дело, если COM-компонент существует, другое - написать его только для этого.

Между первыми двумя это вопрос того, кто еще может использовать эту библиотеку. Если код C # - единственный, кто его использует, делайте что хотите. Но, например, у вас может быть 15 или 20 собственных методов, которые устанавливают различные свойства, за которыми следует метод go или execute, который выполняет реальную работу. Поскольку управляемое внутреннее взаимодействие имеет свою стоимость, я бы посоветовал вам написать одну функцию C ++ / CLI, которая принимает 20 параметров, вызывает различные собственные функции и затем вызывает go или execute. Это дает вам более короткий интерфейс вместо болтовни и снижает ваши затраты на взаимодействие.

0 голосов
/ 15 июня 2011

Вы можете вызывать нативные библиотеки C / C ++ с любого языка .NET, используя pinvoke.Вот краткое руководство от MSDN .Вы также можете создать COM DLL в C ++, на который вы можете ссылаться непосредственно из C #, используя COM Interop.Если вам не нужны преимущества COM, pinvoke - гораздо более простой путь.

И, конечно, как сказал Конрад, вы оборачиваете C ++ dll, используя управляемое решение C ++.

КакНапример, посмотрите http://www.pinvoke.net/ для примеров того, как вы вызываете API Win32 из C #.

По ссылке MSDN выше (изменено согласно комментарию ниже):

using System;
using System.Runtime.InteropServices;

class PlatformInvokeTest
{
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int puts(
        [MarshalAs(UnmanagedType.LPStr)]
        string m);
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int _flushall();


    public static void Main() 
    {
        puts("Hello World!");
        _flushall();
    }
}
...