Вопрос об использовании C ++ DLL-функции в C # - PullRequest
0 голосов
/ 27 июля 2011

У меня есть DLL, созданная на C ++, которая затем используется в программе на C #. программа на C # ссылается на DLL, а я вызываю классы и могу использовать функции, определенные в DLL.

Теперь я хочу добавить другие функции в DLL, чтобы я мог запускать код C ++ в C #. Я следую примеру того, как определяются другие функции в DLL; .h и .cpp, и я создаю новую функцию, которая выполняет код. Я помещаю его в те же места, что и ранее определенные функции, но когда я помещаю DLL в мой код C #, моей функции там нет. когда я создаю экземпляр класса DLL, моя функция не является его частью.

Я поместил его в .h как публичную функцию класса и дал ему код для запуска в .cpp, но он не найден.

Почему моя программа на C # не видит функцию, которую я сделал, хотя она следует тому же набору, что и другие функции?

UPDATE

code.h:

#pragma once

#include <windows.h>
#include <PvDisplayWnd.h>
#include <vfw.h>
#include "NPvResult.h"
#include "NPvDeviceInfo.h"
#include "NPvBuffer.h"
#include <string>

using namespace System;
using namespace System::Runtime::InteropServices;

public ref class NPvDisplayWnd
{
public :
    NPvDisplayWnd();
    bool Handle();
    NPvResult^ ShowModeless(long locx, long locy, long x, long y);
    NPvResult^ ShowModal();
    NPvResult^ NPvDisplayWnd::Create();
    int^ Display( NPvBuffer^ aBuffer, int^ x);
    NPvResult^ Work( const std::string afilename, unsigned short asizex, unsigned short asizey, unsigned short aBPP, double aFPS);
    NPvResult^ Close();
    NPvResult^ DoEvents();
}

code.cpp:

#include "NPvDisplayWnd.h"

NPvDisplayWnd::NPvDisplayWnd(){code}
NPvResult^ NPvDisplayWnd::Create(){code}
bool NPvDisplayWnd::Handle()
NPvResult^ NPvDisplayWnd::ShowModeless(long locx, long locy, long x, long y){code}
NPvResult^ NPvDisplayWnd::ShowModal(){code}
int^ NPvDisplayWnd::Display( NPvBuffer^ aBuffer, int^ x){code}
NPvResult^ NPvDisplayWnd::DoEvents(){code}
NPvResult^ NPvDisplayWnd::Work( const std::string aFileName, unsigned short aSizeX, unsigned short aSizeY, unsigned short aBPP, double aFPS){code}
NPvResult^ NPvDisplayWnd::Close(){code}

Функция, которую я добавил, была функцией Work (). если я создаю это и помещаю это в мой код C #, он видит все функции, кроме работы. Чтобы убедиться, что я использую правильный .dll, я изменил имя ShowModeless () на ShowModeless__F () и перестроил его и добавил в мой C #, и изменение перенесено, но я все еще не видел свою функцию Work () .

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

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

namespace XX
{ 
  public ref class YourClass{...};
}

Экспортирует управляемый класс YourClass в XX пространстве имен. Вам нужно использовать /CLR флаг компилятора.

Вы можете скомпилировать набор файлов CPP как управляемый, а набор других файлов - как неуправляемый. Управляемые классы не могут содержать неуправляемые вещи (если не объявлен указатель).

0 голосов
/ 27 июля 2011

В Windows вы должны явно экспортировать символы, чтобы пользователи могли получить к ним доступ через библиотеки DLL.Это делается с использованием синтаксиса __declspec(export).Это необходимо во время компиляции и компоновки DLL.


Теперь, когда мы знаем, что вы используете C ++ / CLI вместо обычного C ++, мы можем увидеть проблему.Work занимает std::string.Но Work предназначен для управляемой функции, и управляемый код не может принимать std::string в качестве параметра.Вместо этого вам нужно взять управляемый строковый тип.

...