Как создать DLL, которая будет использоваться в C # - PullRequest
9 голосов
/ 27 октября 2011

У меня плата ICOP VDX-6354 под управлением Win CE.Я пытаюсь управлять зуммером платы из моей программы на C #.Я перепробовал все playound и т. Д. "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)

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

Что мне делать шаг за шагом?

РЕДАКТИРОВАТЬ:

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

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

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

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

Не удается найти PInvoke DLL 'MyBeep.dll '.

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

Ответы [ 2 ]

1 голос
/ 28 октября 2011

У вас есть две проблемы:

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

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

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

РЕДАКТИРОВАТЬ: Вы также должны убедиться, что ваш проект C ++ собирается перед вашим проектом C #.Щелкните правой кнопкой мыши файл проекта C # и перейдите в раздел «Зависимости проекта», затем отметьте библиотеку C ++ в поле «Зависит от».Чтобы убедиться, что ваш шаг после сборки работает, попробуйте просто собрать проект C ++ самостоятельно и проверить, что он копирует DLL в правильный каталог в вашем проекте C #.Он будет отмечать ошибки в окне вывода, если это не так.Если вы следовали этому руководству для создания DLL, все должно быть в порядке.

0 голосов
/ 23 января 2012

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

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

...