C# 中 LibraryImport 和 DllImport有什么不同

devtools/2024/11/13 10:11:43/

libraryimportdllimport 是两个与动态链接库(DLL)相关的术语,它们在不同的编程语言和上下文中有不同的含义和用途。

在 C# 中,DllImportAttribute 是一个特性,用于指示一个方法声明是作为对非托管 DLL 中函数的 P/Invoke 调用。这意味着你可以在 C# 代码中直接调用在 DLL 中定义的函数。例如:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr MessageBox(IntPtr hWnd, String text, String caption, uint type);

LibraryImportAttribute 是 .NET 7 中引入的一个新特性,用于源生成器,它可以在编译时生成 P/Invoke 调用的封送代码,而不是在运行时生成。这样可以提高性能,并且适用于 AOT(Ahead-of-Time)编译场景。使用 LibraryImportAttribute 的方式如下:

[LibraryImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static partial bool MessageBoxW(IntPtr hWnd, string text, string caption, uint type);

在 C++ 中,__declspec(dllexport)__declspec(dllimport) 是用来控制类、函数或变量的导出和导入的关键字。当你创建一个 DLL 并希望其他程序能够使用你的 DLL 中的函数时,你会使用 __declspec(dllexport) 来标记这些函数。相反,当你的程序需要使用另一个 DLL 中的函数时,你会使用 __declspec(dllimport) 来导入这些函数。例如:

// DLL 导出
extern "C" __declspec(dllexport) int add(int a, int b) {return a + b;
}// DLL 导入
extern "C" __declspec(dllimport) int add(int a, int b);

在 C++ 中,dllexportdllimport 也可以用于类,当一个类被声明为 dllexport 时,它的所有成员函数和静态数据成员都会被导出。而当一个类被声明为 dllimport 时,它的所有成员函数和静态数据成员都会被导入。需要注意的是,对于 dllimport 类,静态数据成员的定义不能在声明类的程序中指定 。

总的来说,libraryimportdllimport 是处理 DLL 导入和导出的不同机制,它们在不同的编程环境中有不同的实现和用法。


http://www.ppmy.cn/devtools/132890.html

相关文章

缓存、注解、分页

一.缓存 作用:应用查询上,内存中的块区域。 缓存查询结果,减少与数据库的交互,从而提高运行效率。 1.SqlSession 缓存 1. 又称为一级缓存,mybatis自动开启。 2. 作用范围:同一…

JMeter与大模型融合应用之jmeter.properties配置文件新增配置

JMeter与大模型融合应用之jmeter.properties配置文件新增配置 背景 Apache JMeter 是一款流行的开源性能测试工具,它允许用户通过创建和运行多种类型的测试来评估应用程序的性能。jmeter.properties 文件是 JMeter 的主要配置文件之一,用户可以在其中进…

CSS高级技巧_精灵图_字体图标_CSS三角_vertical-align(图像和文字居中在同一行)_溢出文字省略号显示

目录 CSS高级技巧 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图(sprites)的使用 1.2 精灵图的使用 案例:拼出自己名字 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.4.1 字体文件格…

uniapp 小程序 周选择器

这里贴出来的是子组件的代码&#xff0c;父组件只是打开了一下popup // 打开了一下popup $refs.popup.open(bottom)如果不想用子组件的话&#xff0c;直接打开popup就可以用<template><uni-popup ref"popup" type"bottom" background-color&quo…

【论文速读】| PathSeeker:使用基于强化学习的越狱攻击方法探索大语言模型的安全漏洞

基本信息 原文标题: PathSeeker: Exploring LLM Security Vulnerabilities with a Reinforcement Learning-Based Jailbreak Approach 原文作者: Zhihao Lin, Wei Ma, Mingyi Zhou, Yanjie Zhao, Haoyu Wang, Yang Liu, Jun Wang, Li Li 作者单位: Beihang University, Nany…

FastReport将停止 .NET Framework 上的 WebReport 更新

从2024/ 12 /1 日起&#xff0c;Fastreport将停止发布更新和提供对 FastReport.Web (.NET Framework) 的技术支持。该库一直是使用 Online Designer 的许多项目中报告的核心。这些更改意味着 FastReport.Web (Legacy) 库&#xff08;FastReport.Net包的一部分&#xff09;将不再…

php伪协议介绍

PHP伪协议共有12种,具体如下: file:// — 访问本地文件系统http:// — 访问 HTTP(s) 网址ftp:// — 访问 FTP(s) URLsphp:// — 访问各个输入/输出流(I/O streams)php://stdin, php://stdout 和 php://stderrphp://inputphp://outputphp://memory 和 php://tempphp://filte…

原生html+js输入框下拉多选带关闭模块完整案例

<!DOCTYPE html> <html> <head> <title>多选下拉框</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; } .multi-select-container { position: relative; width: 300px; margin: 20px; font-family: Arial, sans-seri…