【问题标题】:Is there a way to call an unmanaged (not COM) dll from C# application?有没有办法从 C# 应用程序调用非托管(非 COM)dll?
【发布时间】:2010-10-03 07:50:27
【问题描述】:

有没有办法在我的 C# 应用程序中使用(引用)以非托管 C++(不是 COM 库)编写的 DLL?

当我尝试从 Visual Studio 中引用它时,我收到“不是 COM 对象”错误消息。

也许有某种翻译器\路由器可以 COMify 我的 DLL 引用? 我不知道 COM 和 COM 互操作是如何工作的,因为我在这对我来说已经没有必要的时候就开始编程了。

谢谢。

【问题讨论】:

    标签: c# c++ interop unmanaged marshalling


    【解决方案1】:

    您需要使用 DllImport 属性。下面是 Win32 PostMessage 函数的示例:

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool PostMessage(IntPtr handle, int message, IntPtr wparam, IntPtr lparam);
    

    【讨论】:

    • [return: ] 标签有什么用? -g
    • 在本例中,它指定 MarshalAs 属性应用于函数的返回值。
    【解决方案2】:

    请参阅 MSDN 上的“使用非托管 DLL 函数”主题:

    http://msdn.microsoft.com/en-us/library/26thfadc.aspx

    无需添加任何 COM 代理,.NET 可以使用 [DllImport] 属性直接使用 DLL。您还可以通过指定其他属性来完全控制 .NET 和非托管 DLL 之间的编组。

    【讨论】:

      【解决方案3】:

      Joe 已经回答了这个问题,所以我将继续解决这个问题 - 为了节省自己一些时间并且不必挖掘和破坏函数签名,P/Invoke 有一个非常完整的 Win32 签名库,形式为既是 wiki 又是 Visual Studio 插件!

      查看P/Invoke

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多