如何创建将在C#中使用的DLL

时间:2011-10-27 14:53:25

标签: c# dll compact-framework windows-ce beep

我有运行Win CE的ICOP VDX-6354板。我正试图从我的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)

希望我能够控制蜂鸣器。我的问题是我无法成功编译它。我按照here的步骤进行了操作,但它对我没有帮助。

我应该一步一步做什么?

编辑:

我想我构建了DLL。我尝试了另一种方法来构建DLL found here

现在,我将DLL复制到我的C#启动项目的Debug文件夹(该项目的其他DLL也在此文件夹中)。然后我尝试通过以下方式从我的C#项目中的MyBeep.DLL调用MyBeep函数:

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

但是它给出了以下例外。

  

找不到PInvoke DLL'MyBeep.dll'。

我错过了什么吗?请检查我上面给出的链接,以便构建DLL以了解到目前为止我做了什么。 问候。

2 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. 您需要构建dll,而不是尝试调试它。如果它与C#项目位于同一项目中,则将C#项目设置为启动项目(右键单击项目文件),如果不是,则只需选择Build而不是Start Debugging(如果使用快捷方式)键可能是Ctrl + Shift + B [如果使用C#环境设置]或F7 [如果您使用的是C ++环境设置]。)

  2. 您需要将DLL放在正确的位置。如果你想自动化这个,那么只需在C ++项目中添加一个构建后的步骤(项目属性,构建操作,如果我没记错,以及后期构建),这样做就像copy "$(TargetPath)" "$(SolutionDir)\CsProj\bin\$(ConfigurationName)\*.*"

  3. 这些宏中的一些可能有些偏差,但你应该得到一般的想法。

    编辑:您还需要确保在C#项目之前构建C ++项目。右键单击您的C#项目文件,然后转到Project Dependencies,然后在Depends on框中勾选C ++库。要确保您的构建后步骤正常工作,请尝试单独构建C ++项目并检查它将DLL复制到C#项目中的正确目录。如果没有,它会在输出窗口中标记错误。如果您按照该教程创建DLL,那么您应该没问题。

答案 1 :(得分:0)

即使错误消息另有说明,您应该检查导出函数的名称。对于Win32,我总是使用this tool。对于CE dll,可能DUMPBIN /EXPORTS有效。

功能名称很可能被称为__MyBeep:我相信这个前缀是C约定。