Как создать 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
: Я считаю, что этот префикс является кон.
есть две проблемы, которые у вас есть:
вам нужно построить dll, а не пытаться отладить его. Если он находится в том же проекте, что и ваш проект c#, установите проект C# в качестве проекта запуска (щелкните правой кнопкой мыши файл проекта), если нет, вам просто нужно выбрать Build, а не начать отладку (если вы используете сочетания клавиш, это, вероятно, будет Ctrl+Shift+B [если вы используете настройку среды C#] или F7 [если вы используете среду c++ установка.)]
вам нужно иметь DLL в правильном месте. Если вы хотите автоматизировать это, просто добавьте шаг после сборки в проект C++ (свойства проекта, действия сборки, если я правильно помню, и после сборки), который делает что-то вроде
copy "$(TargetPath)" "$(SolutionDir)\CsProj\bin$(ConfigurationName)\*.*"
некоторые из этих макросов могут быть немного выключены, но вы должны получить общую идею.
EDIT: вам также нужно убедиться, что ваш проект C++ строится перед вашим C# проект. Щелкните правой кнопкой мыши файл проекта C# и перейдите к зависимостям проекта, затем отметьте библиотеку C++ в поле зависит от. Чтобы убедиться, что ваш шаг после сборки работает, попробуйте просто создать проект C++ самостоятельно и проверить, что он копирует DLL в правильный каталог в вашем проекте c#. Он будет отмечать ошибки в окне вывода, если это не так. Если вы следовали этому руководству для создания DLL, вы должны быть в порядке.