【问题标题】:Creating .Net Wrappers for Windows API and COM DLLs为 Windows API 和 COM DLL 创建 .Net 包装器
【发布时间】:2012-10-11 21:51:31
【问题描述】:

首先让我说我不知道​​我目前不知道什么,所以我认为我也在寻找更好的问题,而不是具体的答案。我的 .Net/C# 足够稳固,我的 C/C++ 也不错。

最近,我发现标准 .Net 框架中没有库可以完成某些任务,虽然下载第三方库很容易,但如果有的话,我想了解如何自己完成尚不存在。

在最近的一个案例中,我需要在 Windows 中以相对较低的级别处理 MIDI,我偶然发现“winmm.dll”是我需要通过下载 .net 包装器来使用的库MIDI 和浏览源代码。我知道我必须创建一个包装类并完成整个 P/Invoke 事情才能实现。

接下来我搜索了有关 Windows API 的文档,以弄清楚“winmm.dll”的神秘盒子中发生了什么,令我高兴的是,我能够找到一个完整的 Windows SDK下载并通读。我浏览了“Windows 开发”的“入门”部分,其中涵盖了一些通过 C++ 的基础知识。它谈到了一些关于 COM、windows 头文件的内容,而且我对 C++ 了解得足够多。

现在,我需要帮助来解决几个问题:

1) 到目前为止,Windows SDK 似乎建议我要对特定的头文件而不是 dll 本身进行编程,但我发现的 .net 包装器通常指向特定的 .dll 而不是头文件文件...

/// <summary>
/// Returns the number of MIDI input devices on this system.
/// </summary>
/// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711608(VS.85).aspx
[DllImport("winmm.dll", SetLastError = true)]
public static extern UInt32 midiInGetNumDevs();

我的印象是头文件和 DLL 需要在同一个文件夹中,但是 windows SDK 包含一个包含所有 windows 头文件的文件夹,并且没有 DLL(我猜注册表在这里起作用映射到特定的库?)?这些头文件最终是如何映射到实际库的,为什么看起来我什至不需要处理头文件来创建 .Net 包装器?

2) 我似乎找不到有关 winmm.dll 的文档,但我在 Windows SDK 的“Windows API”列表中找到了对我可能需要的函数的引用,我很确定这些函数的代码在 winmm.dll 中。如何找到开始创建包装器所需的特定库的文档?如果我不知道我将需要 winmm.dll 来访问 Windows MIDI 功能,我自己怎么能弄明白呢?

3) 有些 DLL 是 COM,有些是普通的 windows DLL,有些是 .net DLL……我如何才能分辨出不同的未来?似乎为前两者创建包装器需要不同的方法。

4) MSDN 上没有列出其所有 API 的“Winmm.dll”页面,我认为这有一个很好且实际的原因,但我不确定它是什么?我已经习惯了 .Net 领域,我几乎可以毫不费力地弄清楚库的作用以及如何使用它。

提前感谢您提供任何见解。

【问题讨论】:

    标签: c# winapi


    【解决方案1】:

    这方面的圣经是 Adam Nathans 的优秀著作《.Net 和 COM 的完整互操作性指南》

    包括 PInvoke 和几个音频类型示例

    【讨论】:

      【解决方案2】:

      1) Windows API 文档包括每个方法/枚举/等的头文件、库和 dll 文件。当我通读到注意到这一点时,我只是没有向下滚动足够远。头文件不一定要与 dll 位于同一目录中;编译程序时,它的内容只是简单地复制/粘贴到 .c 文件中。我在这里缺少的部分是编译的链接阶段,我读到了here

      2) 文档就在那里——我只需要更加努力地寻找它。

      3)How can I detect the type of a dll? (COM, .NET, WIN32)

      4) 音频的 api 理论上可以跨越多个 dll,所以最好的做法是找到 API 文档,找到要包装的方法,然后找出这些方法在哪些 dll 中,然后导入每个那些 DLL。

      【讨论】:

        猜你喜欢
        • 2011-01-08
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多