从C#程序中调用非受管DLLs的方法

C#程序中调用非托管 DLLs 的方法可以使用 P/Invoke,其作用是在 C# 代码中声明非托管函数并在 C# 中调用它们。

以下是从 C# 中调用非托管 DLL 的完整攻略:

步骤一:找到非托管 DLL,并获取该 DLL 中包含的函数及其参数。

通常,在VS中打开非托管 DLL 时,可以在 “Object Browser” 中查看 DLL 中导出的函数及其参数。如果 DLL 没有文档,可以使用工具如 Dependency Walker(Depends)或者 Object Manager 进行查看。

步骤二:在 C# 代码中声明该非托管函数。

使用 [DllImport] 特性来声明一个非托管函数。可以使用此特性显式的告诉 C# 编译器如何映射函数。

以下是一个示例:

[DllImport("User32.dll")]
static extern int MessageBox(IntPtr hWnd, String Text, String Caption, int Options);

上面所使用的 DLL 是Windows的 User32.dll 。函数是 MessageBox 函数,该函数用于显示一条消息,它有 4 个参数:窗口句柄,消息文本,消息标题和一些选项。

步骤三:调用非托管函数。

在 C# 中,你可以通过 Marshal 类来将参数从 C# 托管代码格式转换为非托管代码格式。例如,要显示对话框,调用 MessageBox 函数,可以使用以下代码:

int MB_YESNO = 0x00000004;
int result = MessageBox(IntPtr.Zero, "Are you sure?", "My Dialog Box", MB_YESNO);

如果用户单击 Yes,示例将返回 6,如果用户单击 No,该示例将返回 7。

下面是另一个示例,此示例将使用 LINQPad 软件调用一个非托管 DLL:

void Main()
{
    const string dllPath = @"C:\Temp\CppLibrary.dll";
    const string functionName = "add";
    const int a = 5;
    const int b = 7;
    var sum = CallUnmanagedFunction<int>(dllPath, functionName, a, b);
    sum.Dump();
}

T CallUnmanagedFunction<T>(string dllPath, string functionName, params object[] arguments)
{
    var library = LoadUnmanagedDll(dllPath);
    var targetFunction = library.GetProcAddress(functionName);
    return Marshal.GetDelegateForFunctionPointer<T>(targetFunction)(arguments);
}

NativeLibrary LoadUnmanagedDll(string dllPath)
{
    return NativeLibrary.Load(dllPath);
}

这个程序使用 NativeLibrary.Load 加载非托管 DLL,使用 NativeLibrary.GetProcAddress 获取非托管函数指针,最后使用 Marshal.GetDelegateForFunctionPointer 获取委托并调用非托管函数。

在这个例子中,非托管函数名为 add,有两个 int 类型的参数并返回一个 int 类型的值。

总之,使用 P/Invoke 在 C# 程序中调用非托管 DLLs 的方法,是使用 C# 调用原生 Win32 API 程序的主要方法之一,这种方法对于访问直接使用 Win32 API 的 DLLs (尤其是像 User32.dll 中有太多需要直接使用的函数的 DLLs)是非常有用的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从C#程序中调用非受管DLLs的方法 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • ASP.NET Core缓存静态资源示例详解

    ASP.NET Core缓存静态资源示例详解 在ASP.NET Core应用程序中,缓存静态资源可以提高应用程序的性能和响应速度。本攻略将介绍如何在ASP.NET Core应用程序中缓存静态资源。 步骤 以下是在ASP.NET Core应用程序中缓存静态资源的步骤: 安装Microsoft.AspNetCore.StaticFiles包。 在ASP.NET …

    C# 2023年5月17日
    00
  • 详解.Net core2.0日志组件Log4net、Nlog简单性能测试

    详解.Net core2.0日志组件Log4net、Nlog简单性能测试 在.NET Core 2.0应用程序中,日志记录是一个非常重要的组件。本攻略将深入探讨.NET Core 2.0中两个流行的日志组件Log4net和Nlog,并提供两个示例说明。 Log4net Log4net是一个流行的.NET日志记录组件,它提供了灵活的配置选项和高度可定制的输出格…

    C# 2023年5月17日
    00
  • 详解c# AutoMapper 使用方式

    详解c# AutoMapper 使用方式 什么是AutoMapper? AutoMapper是一个C#库,用于对象之间的映射(mapping)。当我们需要将一个对象(Source)的属性值映射到另一个对象(Target)时,AutoMapper可以帮助我们快速而简便地完成这项工作,而无需手动写出大量的赋值表达式。 安装AutoMapper 可以通过NuGet…

    C# 2023年6月1日
    00
  • c#数据库与TXT导入导出的实例

    下面就是“C#数据库与TXT导入导出的实例”的完整攻略,包含以下内容: 一、编写C#程序连接数据库 首先,需要引用System.Data.SqlClient命名空间。 csharp using System.Data.SqlClient; 然后,需要定义一个SqlConnection对象来连接数据库,这个对象需要传入一个连接字符串。其中,连接字符串中需要填写…

    C# 2023年6月1日
    00
  • wxPython实现文本框基础组件

    下面我会详细讲解“wxPython实现文本框基础组件”的完整攻略。 标题 1. 前言 wxPython 是基于 Python 语言的一种 GUI 工具包。使用 wxPython 可以方便地进行图形用户界面的开发。本文介绍了如何使用 wxPython 实现文本框基础组件。在本示例中,使用 Python 3.x 和 wxPython 4.x 版本进行演示。 2.…

    C# 2023年5月31日
    00
  • c#通过app.manifest使程序以管理员身份运行

    下面是详细讲解“c#通过app.manifest使程序以管理员身份运行”的完整攻略: 1. 为何需要以管理员身份运行程序 在Windows系统中,一些操作需要管理员权限才能够执行,例如修改系统配置、创建和删除文件夹等等。对于这些需要管理员权限的操作,我们需要以管理员身份运行程序才能够正常执行。 2. 如何使用app.manifest来使程序以管理员身份运行 …

    C# 2023年6月1日
    00
  • c#动态编译执行对象方法示例 运用映射机制创建对象

    首先我们来详细讲解一下如何在C#中动态编译执行对象方法,具体步骤包括以下几个方面: 1.使用C#动态编译器进行编译2.使用反射获取程序集,类型以及方法3.创建对象实例并执行方法 步骤1:使用C#动态编译器进行编译 使用C#动态编译器可以将代码字符串编译成程序集,代码示例如下: string code = @"using System; public…

    C# 2023年6月1日
    00
  • Asp.Net Mvc2 增删改查DEMO附下载

    Asp.Net Mvc2 增删改查 DEMO是一个用来演示 ASP.NET MVC 2 框架的基本增删改查功能的示例。本攻略将详细介绍该示例的用法、安装步骤、示例说明以及相关链接。 安装步骤 下载代码:从Github仓库中下载代码 https://github.com/kauaikintetsu/AspMvcLearn 解压文件:将下载好的压缩包解压到一个文…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部