Написание C ++ DLL, которую может вызвать приложение C # .NET? - PullRequest
1 голос
/ 23 марта 2012

Это ситуация.Я пишу бэкэнд-приложение на C ++, и мои коллеги используют C # для внешнего интерфейса.По сути, мое внутреннее приложение выполняет обработку изображений для изображений, полученных из внешнего интерфейса C #, и возвращает текстовый файл с данными об изображении.Ранее мы записывали изображения на диск и вызывали приложение C ++ с указанием пути к файлу изображения.Однако такая запись / чтение с диска стала узким местом, поэтому мы хотим преобразовать приложение C ++ в DLL.

На базовом уровне я хочу показать единственный метод из моего приложения C ++в C # one через DLL (приложение C # является веб-интерфейсом):

int ProcessImage(System::Bitmap^ image, System::String ^results)

Как я могу это сделать?Я использую VC ++ Express 2008, и мой код C ++ в настоящее время компилируется с CLR (хотя я смешал много собственного кода C ++ внутри).

Я искал в Интернете, но все еще застрял всделай это.Я думаю, что C ++ / CLI DLL - лучший вариант, но как мне это сделать? Написание DLL на C / C ++ для взаимодействия .Net

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Если вы маркируете свою функцию C ++ как функцию "C", то она может быть вызвана PInvoke.

Ваша функция C будет выглядеть так:

extern "C" __declspec(dllexport) int Test() {
    return 1;
}

Ваша ссылка на C # будет выглядеть так:

[DllImport("test.dll")]
public static extern int Test();

Если ваша функция C ++ является членом экземпляра, вы все равно можете это сделать, но для этого нужны некоторые хитрости.

1 голос
/ 29 марта 2012

Я наконец понял это.Что вам нужно сделать:

  1. В вашем проекте C ++ установите параметр в Visual C ++ для компиляции с clr pure , что делает проект C ++ / CLI единым
  2. В вашем проекте C ++ представьте методы, создав открытый класс ref:

    public ref class Interop
    {
    public:
        //! Returns the version of this DLL
        static System::String^ GetVersion() {
            return "3.0.0.0";
        }
    
        //! Processes an image (passed by reference)
        System::Int32^ Process(Bitmap^ image);
    }
    
  3. В программе на C # добавьте ссылку на C ++ DLL, которую вы скомпилировали
  4. В программе на C # вызовите эти методы (т.е. Interop::Process(myBitmapInCS))

Я считаю, что этот метод называется "неявным P / Invoke". Надеюсь, это поможет!

...