从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 6框架揭秘实例演示之如何承载你的后台服务

    ASP.NET Core 6是一款高效、开源的Web应用程序框架,支持多平台和云端部署,且拥有可扩展的体系结构,非常适合构建现代化的Web应用程序。本文将基于该框架,详细讲解如何承载你的后台服务,针对不同的应用场景,提供多条实例演示。 一、使用ASP.NET Core 6承载后台任务 在Web应用程序中,有很多后台任务需要执行。例如,订阅事件、启用定时任务、…

    C# 2023年6月3日
    00
  • C#从前面或后面按指定数量删除字符串

    让我为您详细讲解 “C#从前面或后面按指定数量删除字符串” 的完整攻略吧。 方法一:Substring()方法 C#的字符串类型中有一个名为Substring()的方法,可以截取子字符串,从而实现删除指定数量的字符。 从前面删除字符串 从前面删除字符串,需要保留剩余字符串的后面部分,可以使用Substring()方法的起始位置参数startIndex和需要保…

    C# 2023年6月8日
    00
  • 基于一个应用程序多线程误用的分析详解

    基于一个应用程序多线程误用的分析详解 研究目的 本研究旨在探究在多线程应用程序开发中常见的误用,分析其原因以及给出解决方案。 误用场景 多线程应用程序开发中,最常见的误用场景之一就是未正确使用锁机制,导致多个线程访问共享资源时出现竞态条件,从而引发意外的程序崩溃或执行异常。在此,我们将对锁机制的误用进行详细分析。 常见的锁机制误用 锁粒度过小 当多个线程对同…

    C# 2023年5月14日
    00
  • 详解.net mvc session失效问题

    关于”详解.net mvc session失效问题”,以下是一些攻略建议: 1. 理解Session失效 Session是ASP.NET MVC应用程序中一种存储数据的机制,它是基于Cookie实现的,因此只要客户端浏览器中的Cookie被操作,Session就会失效。此外,Session还有一些其他的因素会导致其失效。因此,当用户在使用应用程序时,可能会遇…

    C# 2023年5月31日
    00
  • C#使用DirectX.DirectSound播放语音

    下面我就详细讲解一下C#使用DirectX.DirectSound播放语音的完整攻略。 1.准备工作 在开始使用DirectX.DirectSound播放语音之前,需要先安装Microsoft DirectX SDK,并将其添加到工程引用中。 2.创建DirectSound实例 使用DirectX.DirectSound播放语音的第一步是创建DirectSo…

    C# 2023年6月6日
    00
  • C# File.OpenRead(string path):以只读模式打开指定文件,并返回FileStream对象

    C#的File类是一个非常常用的类,提供了很多关于文件和文件夹操作的方法,其中之一就是OpenRead(string path)方法。 OpenRead(string path)方法的作用 OpenRead(string path)方法用于以只读方式打开指定路径下的文件,并返回该文件的FileStream对象,该对象用于读取文件内容。 OpenRead(st…

    C# 2023年4月19日
    00
  • C#监控文件夹变化的方法

    下面我将为你详细讲解“C#监控文件夹变化的方法”的完整攻略。 1. 使用FileSystemWatcher类 在C#中,我们可以使用FileSystemWatcher类来监听特定文件夹的变化。使用方法如下: // 实例化一个FileSystemWatcher对象 FileSystemWatcher watcher = new FileSystemWatche…

    C# 2023年6月1日
    00
  • 轻松学习C#的结构和类

    您好,如果想轻松学习C#的结构和类,可以按照以下步骤进行: 1.了解C#语言的基本结构和类的基础概念 首先可以从阅读一些相关的C#基础书籍或者网站文章开始,例如Microsoft官方的C#开发文档。 掌握C#语言关键字、语法和面向对象的基础特性,例如C#中type、class、struct、interface等的使用方法,以及属性、方法、字段、构造器等类的基…

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