编写C++非托管DLL以及在.NET托管中调用
来源:互联网 发布:淘宝卖家有什么好软件 编辑:程序博客网 时间:2024/05/23 18:38
编写C++非托管DLL以及在.NET托管中调用
新建项目,来到Win32,点击Win32项目
输入名称MyVC点击确定。
应用程序类型,勾选DLL,点击完成。
MyVC.cpp
#include "stdafx.h"
#include <stdio.h>
extern "C" __declspec(dllexport)int Max(int a,int b)
{
return a>b?a:b;
}
extern "C" __declspec(dllexport)int Min(int a,int b)
{
return a>b?b:a;
}
//此示例来自CSDN
extern "C" __declspec(dllexport)void GetName(char* buffer,int* size)
{
printf("before copy the length is:%d\n", *size);//写数据前buffer的容量
char temp[] = "hello,world";
strcpy(buffer,temp);//模拟写数据
printf("OK, string is:%s\n", buffer);
*size = (int)strlen(temp);
printf("after copy the length is:%d\n", *size);//写数据后buffer的容量
}
其中 extern "C " 生成的dll,不会分解函数名
其中__declspec(dllexport) 导出dll为其他程序调用
好了,生成即可。
生成的dll放到 C:\WINDOWS\system32 目录下面,这样不需要指定路径。
或者不放在此文件夹下面,那直接指定完整的目录也可以。
嗯,现在在.NET中调用它
using System.Runtime.InteropServices;
[DllImport(@"D:\MyVC\Debug\MyVC.dll")]
public externstatic void GetName(StringBuilder sb,IntPtr length);
[DllImport(@"D:\MyVC\Debug\MyVC.dll")]
public externstatic int Max(int a,int b);
[DllImport(@"D:\MyVC\Debug\MyVC.dll")]
public externstatic int Min(int a,int b);
static void Main(string[] args)
{
StringBuilder sb = newStringBuilder(256);
IntPtr ptr = Marshal.AllocHGlobal(sizeof(int));//申请一个整数指针
Marshal.WriteInt32(ptr, sb.Capacity);//给指针内容赋初值为缓冲区容量
GetName(sb, ptr);
Marshal.FreeHGlobal(ptr);
Console.WriteLine(Max(22, 106).ToString()); //106
Console.WriteLine(Min(22, 106).ToString()); //22
Console.Read();
}
我在制作过程中遇到的一些问题:
无法加载 DLL“MyVC.dll”:参数不正确。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))。
清理解决方案再生成
对 PInvoke函数“ConsoleApplication1!ConsoleApplication1.Program::Max”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke签名的调用约定和参数与非托管的目标签名是否匹配。
点击C++项目属性,来到配置属性下面的C/C++,点击高级
在右边的“调用约定”里,选择__stdcall (/Gz)
- 编写C++非托管DLL以及在.NET托管中调用
- C#.Net调用非托管的DLL
- C#调用非托管C编写DLL的数据类型转换
- 使用C#.net调用非托管DLL遇到的问题
- ASP.NET中调用非托管DLL的问题
- 在非托管的 VC++2005 中调用托管的 C# DLL 文件
- 托管调用非托管的DLL
- 托管非托管Dll动态调用
- 托管非托管Dll动态调用
- 在托管代码中调用非托管API的查询手册--pinvoke.net
- 在非托管环境中调用托管对象
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管Dll
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管dll
- 常见颜色深度的 bitmap 之间的相互转换
- 在ZigBee网络中怎么实现节电断电之后重新加入网络
- new 第五届,化学实验(吉林大学的map和vector可以打印)
- 【安装黑苹果】Mac OS X10.7(正式版)
- 在Activity的onResume()方法中更新ListView
- 编写C++非托管DLL以及在.NET托管中调用
- 最新Sublime Text 2.0.1 2217 版本破解方法
- 初探Tomcat源码 (8) —— Session_StandardSession
- static 数据成员必须在类定义的外部定义
- 在ubuntu12.04 virtualbox4.2中xp 安装增强功能工具
- php读取mysql结果集的函数
- DICOM开发工具总结
- 全排列算法原理和实现
- 封装了一些辅助类