2013-05-07 4 views
0

Что я пытаюсь сделать: у меня есть встроенный код C, который выполняет некоторую обработку сигнала. У меня также есть набор инструментов C#. Я хотел бы использовать код C# для вызова встроенного кода C с некоторыми формами колебаний, чтобы «проверить» алгоритм и посмотреть, что он думает/делает.C# Pinvoke of C Code issue

Что я сделал:

встроенный код C:

__declspec (dllexport) void SigInit(int Flag); 
void SigInit(int Flag) { ... } 

компилировать как Win32 DLL. Тип конфигурации - «Динамическая библиотека (DLL)», а MFC - «Использует стандартные библиотеки Windows». Я «просмотрел» свою библиотеку в Visual Studio 2010 Class viewer, и все выглядит хорошо.

Тогда в моем C# код (VS2010 с .NET 4.0):

public static class ProcessSignals 
{ 

    [DllImport(@"C:\Users\rpease\Desktop\SigLibrary.dll", CallingConvention = CallingConvention.Cdecl)] 
    public static extern void SigInit(int Flag); 
} 

Но всякий раз, когда я пытаюсь запустить основную программу и вызовите ProcessSignals.SigInit (0):

Не удается найти точка входа с именем 'SigInit' в DLL 'C: \ Users \ rpease \ Desktop \ SigLibrary.dll'.

Я думал, что это проблема с именами, но я думал, что позаботился об этом. Предложения оценены. Я думаю, что следую рекомендациям: PInvoke DLL in C#, но не могу пройти мимо этого.

Спасибо,

Roger

+0

Я выхожу на конечность и говорю, что он использует украшенные имена. Вы можете использовать программу DLL Explorer и проверить, что такое подпись. –

+0

Используйте Dependency Walker (например), чтобы проверить, какие функции экспортируются вашей DLL. –

ответ

1

Открыть команду Студия приглашение Визуальная и изменить каталог в папку, которая содержит DLL в вопросе, а затем запустить:

dumpbin <nameOfDll> /exports 

(где <nameOfDll> является имя файла вашего DLL-файла без угловых скобок)

Вы видите имя функции, которую вы ожидаете в списке ?

+0

Хорошо. Это был хороший намек. Я установил флаги экспорта, но по какой-то причине компилятор начал обновлять другой файл. Спасибо всем, что это были полезные советы! – 2013-05-07 17:38:13

1

Проблема в том, что компилятор C++ переименовывает функции. Объявить экспортированный функцию

extern "C" { 
    __declspec(dllexport) void SigInit(int Flag); 
} 

ИЛИ

Использование depends.exe для просмотра фактического экспортируемого имя функции и установить Entrypoint в атрибуте DllImport.

+0

Я пробовал это, но получил эту ошибку http://support.microsoft.com/kb/133070, поэтому я решил, что компилятор компилируется как C, а не C++. – 2013-05-07 15:30:17