【问题标题】:is it possible to import a dynamic library written in c++ into a c# program [duplicate]是否可以将用c++编写的动态库导入c#程序[重复]
【发布时间】:2013-10-02 22:41:44
【问题描述】:

真的在标题中。我有一个库,用 c++ 编写并编译成 dll。我想在 c# 程序中使用此功能。是否可以直接从 c# 使用库中的类/函数,我是否需要编写一些包装代码才能在托管环境中使用它?它们可以在不安全的环境中使用吗?抱歉,如果这是一个愚蠢的问题 - 我是一名 C++ 程序员,正试图转向 C#。

附言该库来自第三方,因此即使我有时间,我也无法将其直接移植到 c#。

【问题讨论】:

标签: c# c++ dll


【解决方案1】:

这取决于 C++ dll 如何导出它的功能。

如果是通过 C++ 类,那么最好的办法是在 C++/CLI 中构建一个包装器,该包装器将使用 C++ 类并公开 .NET 类以与它们交互。

如果是通过“经典”C 风格的函数,那么您可以使用 p-invoke 直接调用函数。这类似于访问System32User32 等系统DLL 的方式。

【讨论】:

    【解决方案2】:

    是的,这是可能的! 首先添加对 System.Runtime.InteropServices 的引用:

    using System.Runtime.InteropServices;
    

    必须在外部 Dll 上导入函数后:

        [DllImport("ExternalDLL.dll", EntryPoint = "FunctionNameOnExtDll")]
        public static extern CSharpDataType FunctionNameOnExtDll(ParameterDataType ParameterName);
    

    终于用上了!!

    FunctionNameOnExtDll(Parameter);
    

    【讨论】:

    • 您假设 DLL 公开了 C 风格的函数。
    【解决方案3】:

    是的,只要知道要调用的函数的签名并使用 System.Runtime.InteropServices 设施,这是可能的。
    为了提供帮助,请使用此工具 PInvoke Interop Assistant,它可以帮助定义要在调用中传递的数据结构。

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多