【发布时间】:2013-10-02 22:41:44
【问题描述】:
真的在标题中。我有一个库,用 c++ 编写并编译成 dll。我想在 c# 程序中使用此功能。是否可以直接从 c# 使用库中的类/函数,我是否需要编写一些包装代码才能在托管环境中使用它?它们可以在不安全的环境中使用吗?抱歉,如果这是一个愚蠢的问题 - 我是一名 C++ 程序员,正试图转向 C#。
附言该库来自第三方,因此即使我有时间,我也无法将其直接移植到 c#。
【问题讨论】:
真的在标题中。我有一个库,用 c++ 编写并编译成 dll。我想在 c# 程序中使用此功能。是否可以直接从 c# 使用库中的类/函数,我是否需要编写一些包装代码才能在托管环境中使用它?它们可以在不安全的环境中使用吗?抱歉,如果这是一个愚蠢的问题 - 我是一名 C++ 程序员,正试图转向 C#。
附言该库来自第三方,因此即使我有时间,我也无法将其直接移植到 c#。
【问题讨论】:
这取决于 C++ dll 如何导出它的功能。
如果是通过 C++ 类,那么最好的办法是在 C++/CLI 中构建一个包装器,该包装器将使用 C++ 类并公开 .NET 类以与它们交互。
如果是通过“经典”C 风格的函数,那么您可以使用 p-invoke 直接调用函数。这类似于访问System32 和User32 等系统DLL 的方式。
【讨论】:
是的,这是可能的! 首先添加对 System.Runtime.InteropServices 的引用:
using System.Runtime.InteropServices;
必须在外部 Dll 上导入函数后:
[DllImport("ExternalDLL.dll", EntryPoint = "FunctionNameOnExtDll")]
public static extern CSharpDataType FunctionNameOnExtDll(ParameterDataType ParameterName);
终于用上了!!
FunctionNameOnExtDll(Parameter);
【讨论】:
是的,只要知道要调用的函数的签名并使用 System.Runtime.InteropServices 设施,这是可能的。
为了提供帮助,请使用此工具 PInvoke Interop Assistant,它可以帮助定义要在调用中传递的数据结构。
【讨论】: