是否可以使用托管代码中的 C# 反射来调用非托管代码?

2024-02-02

是否可以使用反射和 C# .NET 动态调用在 .NET 出现之前用 C 或 C++ 编写的不同函数(带参数)(非托管代码)?

如果可能的话,一个小的 C# 示例将不胜感激!


是的,动态 P/Invoke 在 .NET 中可以通过不同的方式实现。

LoadLibrary 和 Marshal.GetDelegateForFunctionPointer

这是一个使用的示例Marshal.GetDelegateForFunctionPointer取自该部分委托和非托管函数指针从文章中编写 C# 2.0 不安全代码 http://www.c-sharpcorner.com/UploadFile/PatrickSmacchia/CSharp2UnsafeCode02162006063859AM/CSharp2UnsafeCode.aspx由帕特里克·斯马基亚 (Patrick Smacchia) 创作,这个旧版中也有一个非常相似的样本张俊峰的博客文章 https://learn.microsoft.com/en-us/archive/blogs/junfeng/dynamic-pinvoke

using System;
using System.Runtime.InteropServices;
class Program
{
     internal delegate bool DelegBeep(uint iFreq, uint iDuration);
     [DllImport("kernel32.dll")]
     internal static extern IntPtr LoadLibrary(String dllname);
     [DllImport("kernel32.dll")]
     internal static extern IntPtr GetProcAddress(IntPtr hModule,String procName);
     static void Main()
     {
          IntPtr kernel32 = LoadLibrary( "Kernel32.dll" );
          IntPtr procBeep = GetProcAddress( kernel32, "Beep" );
          DelegBeep delegBeep = Marshal.GetDelegateForFunctionPointer(procBeep , typeof( DelegBeep ) ) as DelegBeep;
          delegBeep(100,100);
     }
}

反射.发射

此方法适用于所有版本的.NET。它在文档中用一个例子进行了描述System.Reflection.Emit.ModuleBuilder.DefinePInvokeMethod https://learn.microsoft.com/en-us/dotnet/api/system.reflection.emit.modulebuilder.definepinvokemethod

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用托管代码中的 C# 反射来调用非托管代码? 的相关文章

随机推荐

  • 使用 doctest 测试异常链接和回溯输出

    如何使用 doctest 测试 多重回溯 看来要用几个ELLIPSIS and
  • 在 Angular 中页面加载(模态显示)后焦点输入后在 Safari iOS 中显示键盘

    我需要在页面加载或显示输入模式后设置焦点并打开键盘 简单的 focus 适用于 Android 以及 iPad 的横向模式 然而 在纵向模式和 iPhone 上 焦点已设置 但未显示键盘 我还尝试了添加并关注附加元素的解决方案 但它不适用于
  • Python 变量作用域和类

    在Python中 如果我定义一个变量 my var 1 2 3 并尝试访问它 init 类的功能 class MyClass def init self print my var 我可以访问它并打印my var没有说明 全局 my var
  • VSCode 找不到 python(Anaconda 安装)

    我刚刚在 windows10 上安装了 anaconda3 5 2 0 和 vscode 1 27 2 实际上是删除并重新安装 并尝试在终端上执行最简单的 python 代码 但是 我收到以下错误 jac p50 mnt c Users j
  • 对于方案中的每个和地图

    这两个功能在方案上有什么区别吗 我正在使用 Dr Racket R5RS 语言制作一个模拟器游戏 我无法决定哪个更好 for each从左到右计算列表元素上的给定函数 并丢弃函数的返回值 它非常适合对列表中的每个元素进行副作用操作 map以
  • Java中的构造函数继承

    您能告诉我以下代码中的问题吗 class boxdemo1 public static void main String args boxweight weightbox new boxweight 2 3 5 4 System out p
  • 如何在 Windows 命令行上使用 Unicode 字符?

    我们有一个项目在团队基础服务器 https en wikipedia org wiki Azure DevOps Server TFS 中包含非英语字符 当尝试编写一些与构建相关的事情的脚本时 我们偶然发现了一个问题 我们无法通过 给命令行
  • 为 Github Pages 中托管的 Jekyll 博客设置自定义子域

    我创建了一个由 Jekyll 驱动的博客 并通过 GitHub Pages 托管它 现在 我想设置一个子域 blog example com 但无法使其工作 我添加了一个 CNAME 文件 其文本为 blog example com 我在我
  • 在 Windows 8.1 上安装 PHP 5.6 后 Apache 2.2 无法启动

    我正在 Windows 8 1 计算机上设置开发环境 我成功安装了Apache 2 2 并下载了php 5 6 3 Win32 VC11 x86 我在 httpd conf 的末尾添加了以下几行 PHPIniDir C PHP5 LoadM
  • c++ opencv图像不显示在boost线程内

    我正在开发c 我在那里使用的应用程序boost opencv 并创建 boost 线程并调用该线程内的函数 该函数已得到 opencv imread 我使用 cvLoadimage 检查过 但得到了相同的结果 但程序无法完成并且程序退出 请
  • KafkaConsumer 连接到错误的代理,因此无法消费

    我根据 Kafka 文档中的示例编写了一个小脚本 import org apache kafka clients consumer KafkaConsumer import org slf4j LoggerFactory import co
  • 如何在 Java 8 中生成给定长度的列表?

    我想通过调用方法 x 次来创建列表 或一般集合 在 Python 中 它会是这样的 self generated self generate for in range length 我尝试在 JDK 8 中编写类似的代码 this gene
  • PHP microtime 基准函数时间比较

    我目前正在使用这个函数来对一些 php 脚本进行基准测试 脚本获取执行所需的微时间 并将其写入服务器上的日志中 但我遇到的问题是我不知道什么是合适的时间 下面的脚本是我的一些时间 任何人都可以告诉我我想要在什么样的时间范围内吗 置于页面开头
  • Laravel 解决闭包的依赖关系

    Laravel 能够自动在控制器构造等中注入依赖项 例如 class Test public function construct Request request App make Test 控制器的构造函数将接收适当的请求外观 有没有办法
  • UIButton 接触 IBAction 导致 EXC_BAD_ACCESS 与 ARC

    StackOverflow 上有一些问题 其中用户遇到了与我相同的问题 然而 他们的解决方案都不适合我的情况 看here https stackoverflow com questions 1421793 normal uibutton c
  • Cypher 查询列出所有断开连接的图 Neo4j 图数据库?

    Neo4j 图形数据库包含大约 50 000 个节点和超过 50 000 个关系 有一个包含大多数节点的主图 但有几个图尚未连接到主图 为了连接各种图以形成一个大的主图 我打算使用 Cypher 查询来列出按其大小排序的路径或连接节点的集合
  • Selenium find element_by_id 不适用于单选按钮

    所以我一直在 Python 中使用 Selenium 我完成了我的代码 当时有效 但突然它选择不再工作 再具体一点 如果我尝试 driver find element by id leasingtrue click 它返回给我错误 sele
  • axios post请求错误,来自react的422(不可处理的实体)

    来自 FastAPI 和 sqlalchemy app post users def create users email str pwd str first name str last name str phone number str
  • 本地主机上的 Nagle 算法

    Nagle 算法在 Windows 中的环回连接上是否处于活动状态 在 Windows 上 出于性能原因 Nagle 算法不适用于环回 TCP 连接微软文档 http technet microsoft com en us library
  • 是否可以使用托管代码中的 C# 反射来调用非托管代码?

    是否可以使用反射和 C NET 动态调用在 NET 出现之前用 C 或 C 编写的不同函数 带参数 非托管代码 如果可能的话 一个小的 C 示例将不胜感激 是的 动态 P Invoke 在 NET 中可以通过不同的方式实现 LoadLibr