2016-11-03 2 views
0

Я пытаюсь использовать встроенную dll C++ внутри приложения C#.Использование cpp dll в C# код

Я следовал за статьей this, чтобы начать работу.

Его работая хорошо, когда dll использует только c-файлы (как в учебнике), но при использовании файлов cpp я не могу заставить его работать.

используя инструмент dumpbin Я вижу, что мои экспортированные имена функций изменены. , например, вызов функции «next» изменился на «? Next @@ YAHH @ Z», и когда я пытаюсь вызвать его в коде C#, он не может найти его.

мой длл код:

__declspec(dllexport) 
int next(int n) 
{ 
    return n + 1; 
} 

C# код

[DllImport("lib.dll", CallingConvention = CallingConvention.Cdecl)] 
    extern static int next(int n); 

его тот же код при использовании файла Си или CPP файлы

Спасибо заранее Amichai

+0

Пожалуйста, ваши код. – wdosanjos

+0

Я не понимаю, что вы подразумеваете под cpp –

+0

@wdosanjos, спасибо. Я добавил свой код к вопросу. – amichai

ответ

2

Что вы пытаетесь сделать, так это сделать функцию батута, чтобы экстернализировать использование ваших объектов C++.

То, что вы испытываете, называется символом mangling. Это C++-специфический способ именования символов (например, функций) в динамической библиотеке и исполняемый файл, чтобы включить полиморфизм.

Вы должны указать, что вы хотите, чтобы отменить эффект коверкая с помощью extern "C" в вашем коде библиотеки, так же, как это:

extern "C" __declspec(dllexport) 
int next(int n) 
{ 
    return n + 1; 
} 

Подробнее об этом here: Exporting functions from a DLL with dllexport

+1

Большое спасибо. очень помогли – amichai

0

Укажите пункт въезда

Пример ниже

[DllImport("lib.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "next", CharSet = CharSet.Ansi)] 
static extern int next(int n); 

Надеется, что это помогает.