/*修改记录
2008-5-11 8:07 曲滨
>> 基本实现预期功能
[!] 明天进行优化
2008-5-12 15:54 曲滨
[E] 优化完成
[N] 加入 NativeCodeHelper 类便于使用
2010-6-17 周振兴
修改兼容性,可在开启DEP及Vista/Win7中运行。
*/
namespace NShellNativeCode
{
using System;
using System.Runtime.InteropServices;
delegate int AddProc(int p1, int p2);
class Program
{
static void Main(string[] args)
{
byte[] codeBytes = {
0x8B, 0x44, 0x24, 0x08 // mov eax,[esp+08h]
, 0x8B, 0x4C, 0x24, 0x04 // mov ecx,[esp+04h]
, 0x03, 0xC1 // add eax,ecx
, 0xC3 // ret
};
/*
上面的字节数组,就是下面函数的本机代码;
int add(int x,int y) {
return x+y;
}
*/
IntPtr handle = IntPtr.Zero;
handle =VirtualAlloc(
IntPtr.Zero,
codeBytes.Length,
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
try
{
Marshal.Copy(codeBytes, 0, handle, codeBytes.Length);
AddProc add
= Marshal.GetDelegateForFunctionPointer(handle, typeof(AddProc)) as AddProc;
int r = add(1976, 1);
Console.WriteLine("本机代码返回:{0}", r);
}
finally
{
VirtualFree(handle, 0, MEM_RELEASE);
}
Console.ReadLine();
}
//Windows API
[DllImport("Kernel32.dll", EntryPoint = "VirtualAlloc")]
public static extern IntPtr VirtualAlloc(IntPtr address, int size, uint allocType, uint protect);
[DllImport("Kernel32.dll", EntryPoint = "VirtualFree")]
public static extern bool VirtualFree(IntPtr address, int size, uint freeType);
//flags
const uint MEM_COMMIT = 0x1000;
const uint MEM_RESERVE = 0x2000;
const uint PAGE_EXECUTE_READWRITE = 0x40;
const uint MEM_RELEASE = 0x8000;
}
}
将《C# 调用非托管程序》一文中最后一种方法修改如下(篇幅原因简化了注释):
张小明
前端开发工程师
CANN asc-devkit bfloat16转float函数
asc_bfloat162float 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://git…
Instatic边缘部署:Vercel Edge Functions配置指南
Instatic边缘部署:Vercel Edge Functions配置指南 【免费下载链接】Instatic Instatic is a modern self-hosted visual CMS - get it running in 1 minute 项目地址: https://gitcode.com/GitHub_Trending/in/Instatic Instatic是一款现代化的自托管可视化C…
Spring WebSocket Portfolio性能优化:10个提升WebSocket应用性能的技巧
Spring WebSocket Portfolio性能优化:10个提升WebSocket应用性能的技巧 【免费下载链接】spring-websocket-portfolio 项目地址: https://gitcode.com/gh_mirrors/sp/spring-websocket-portfolio Spring WebSocket Portfolio是一个基于Spring框架构建的实时…
Missionary vs RxJava vs Core.async:Clojure响应式编程框架对比分析
Missionary vs RxJava vs Core.async:Clojure响应式编程框架对比分析 【免费下载链接】missionary A functional effect and streaming system for Clojure/Script 项目地址: https://gitcode.com/gh_mirrors/mi/missionary Missionary 是一个为 Clojure/Scr…
CANN稀疏算子通用修改指南
通用修改要点 【免费下载链接】ops-sparse 本项目是CANN提供的高性能稀疏矩阵计算的算子库,专注于优化稀疏矩阵的计算效率。 项目地址: https://gitcode.com/cann/ops-sparse 本文件适用于所有文件类型的修改。每次修改完成后,必须逐项检查。 修改…
网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案
网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…