Как создать DLL, которая будет использоваться в C#

у меня есть icop VDX-6354 board под управлением Win CE. Я пытаюсь контролировать зуммер платы из моей программы на C#. Я пробовал все playsound и т. д. " coredll.dll файлы" платформа вызывает. пока никто из них не работал. Поэтому мой последний шанс-создать свою собственную DLL.

unsigned char inp(short addr)
{
    unsigned char cValue;
    _asm
    {
        mov dx, addr
        in ax, dx
        mov cValue, al
    }
    return cValue;
}
void outp(int addr, unsigned char val)
{
     __asm
    {
        push edx
        mov edx, DWORD PTR addr
        mov al, BYTE PTR val
        out dx, al
        pop edx
    }
}
bool MyBeep(DWORD dwFreq, DWORD dwDuration)
{
    outp(0x43, 0xb6); // Set Buzzer
    outp(0x42, (0x1234dc / dwFreq)); // Frequency LSB
    outp(0x42, (0x1234dc / dwFreq) >> 8); // Frequency MSB
    outp(0x61, inp(0x61) | 0x3); // Start beep
    Sleep(dwDuration);
    outp(0x61, inp(0x61) & 0xfc); // End beep
    return TRUE;
}

код выше доступен в техническом описании платы. Я хочу скомпилировать его как DLL, а затем вызвать его в моей программе C#, например

[DllImport("Buzzer.dll", EntryPoint = "MyBeep")]
public static extern void MyBeep(uint dwFreq, uint dwDuration);

я использовал префикс следующим образом, когда я составлено:

extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration)

так что, надеюсь, я смогу контролировать зуммер. Моя проблема в том, что я не смог бы успешно ее скомпилировать. Я пошел по ступенькам.--11-->здесь

что я должен делать шаг за шагом?

EDIT:

Я думаю, что я построил DLL. Я попробовал другой способ построить DLL найти здесь.

теперь я скопировал DLL в папку отладки моего проекта запуска C# (другие библиотеки DLL проекта также находятся в этой папке). Затем я пытаюсь вызвать функцию MyBeep из MyBeep.DLL в моем проекте C# по:

[DllImport("MyBeep.dll", EntryPoint = "MyBeep")]
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration);

но это дает следующее исключение.

не могу найти MyBeep вызов PInvoke dll файлы '.в DLL'.

Я что-то пропустила? Пожалуйста, проверьте ссылки, приведенные выше, что я обманул, чтобы построить DLL, чтобы понять, что я сделал до сих пор. С уважением.

2 ответов


несмотря на то, что сообщение об ошибке предполагает иное, вы должны проверить имя экспортируемой функции. Для Win32 я всегда использую инструмент. Для библиотеки dll CE, возможно DUMPBIN / ЭКСПОРТ строительство.

имя функции, скорее всего, будет называться __MyBeep: Я считаю, что этот префикс является кон.


есть две проблемы, которые у вас есть:

  1. вам нужно построить dll, а не пытаться отладить его. Если он находится в том же проекте, что и ваш проект c#, установите проект C# в качестве проекта запуска (щелкните правой кнопкой мыши файл проекта), если нет, вам просто нужно выбрать Build, а не начать отладку (если вы используете сочетания клавиш, это, вероятно, будет Ctrl+Shift+B [если вы используете настройку среды C#] или F7 [если вы используете среду c++ установка.)]

  2. вам нужно иметь DLL в правильном месте. Если вы хотите автоматизировать это, просто добавьте шаг после сборки в проект C++ (свойства проекта, действия сборки, если я правильно помню, и после сборки), который делает что-то вроде copy "$(TargetPath)" "$(SolutionDir)\CsProj\bin$(ConfigurationName)\*.*"

некоторые из этих макросов могут быть немного выключены, но вы должны получить общую идею.

EDIT: вам также нужно убедиться, что ваш проект C++ строится перед вашим C# проект. Щелкните правой кнопкой мыши файл проекта C# и перейдите к зависимостям проекта, затем отметьте библиотеку C++ в поле зависит от. Чтобы убедиться, что ваш шаг после сборки работает, попробуйте просто создать проект C++ самостоятельно и проверить, что он копирует DLL в правильный каталог в вашем проекте c#. Он будет отмечать ошибки в окне вывода, если это не так. Если вы следовали этому руководству для создания DLL, вы должны быть в порядке.