C#调用C生成DLL文件
来源:互联网 发布:知乎轩辕剑 编辑:程序博客网 时间:2024/05/16 01:35
环境: VS2010, Win7
1. 添加新项目->Win32项目 输入名称:CSInvokeCDll
2.应用程序设置中选择DLL然后点击完成
3 在CSharpInvokeCPP.CPP中书写C代码
#include "stdafx.h"#include "malloc.h"#include "userinfo.h"typedef struct {char name[32];int age;} User; UserInfo* userInfo;extern "C" __declspec(dllexport) int Add(int x, int y) { return x + y; }extern "C" __declspec(dllexport) int Sub(int x, int y) { return x - y; }extern "C" __declspec(dllexport) int Multiply(int x, int y) { return x * y; }extern "C" __declspec(dllexport) int Divide(int x, int y) { return x / y; }extern "C" __declspec(dllexport) int Sum(int * parr, int length){int sum = 0;if(parr == NULL)return sum;for(int i = 0; i < length; i++){sum += *parr++;}return sum;}extern "C" __declspec(dllexport) User* Create(char* name, int age) { User* user = (User*)malloc(sizeof(User))strcpy(user->name, name);user->age = age;return user; }4 添加C#控制台应用程序, 并命名为CSInvokeCPP
5 创建C#对CPP 生成Dll的引用类CPPAdapter
public class CPPAdapter { [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Add(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Sub(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Multiply(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Divide(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Sum(int[] Parr , int length); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern IntPtr Create(string name, int age); [StructLayout(LayoutKind.Sequential)] public struct User { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string Name; public int Age; } }
6 把CSInvokeCDll.dll复制到CSInvokeCPP下的/bin/Debug目录下
7 main函数调用:
static void Main(string[] args) { int result = CPPAdapter.Add(10, 20); int[] arr = new int[] { 1, 2, 3, 4, 5 }; Console.WriteLine("10 + 20 = {0}", result); result = CPPAdapter.Sub(30, 12); Console.WriteLine("30 - 12 = {0}", result); result = CPPAdapter.Multiply(5, 4); Console.WriteLine("5 * 4 = {0}", result); result = CPPAdapter.Divide(30, 5); Console.WriteLine("30 / 5 = {0}", result); result = CPPAdapter.Sum(arr, 5); Console.WriteLine("sum is {0}", result); IntPtr ptr = CPPAdapter.Create("Chevkio", 27); CPPAdapter.User user = (CPPAdapter.User)Marshal.PtrToStructure(ptr, typeof(CPPAdapter.User)); Console.WriteLine("Name: {0}, Age: {1}", user.Name, user.Age); Console.ReadLine(); }
调用结果:
总结:
本文实现了C#通过DllImport和Marshal类对C Dll文件的引用 对于native C++, CLI/C++ 及 C#的效率问题会在下面文章中提到.
疑问:
在C函数Create中申请了内存空间
User* user = (User*)malloc(sizeof(User));
,不知道在哪里释放比较合适. 请高手指点.
- C#调用C生成DLL文件
- C#调用C生成DLL文件
- [zz]C#调用C生成DLL文件
- VS2012 C语言dll文件生成和C#调用
- C语言生成DLL供C#调用
- c#调用C/C++生成的dll
- 使用C#生成dll文件并调用
- c# 调用 .cs 生成的 dll 文件
- 【C#】Visual C# 生成DLL文件 --转
- C#生成dll调用
- C#生成DLL文件
- C#生成DLL文件
- C#生成DLL文件
- C#生成DLL文件
- C#生成DLL文件
- C#调用C++DLL
- C#调用C++dll
- C#调用C++dll
- JS实现Trim()
- PHP中$_FILES的使用及注意事项
- ANDROID继承图
- QT经典错误:/usr/include/qt4/QtCore/qatomic_i386.h:132: error: impossible constraint in 'asm'
- OpenSSL中EC_GROUP_free和EC_KEY_free出错
- C#调用C生成DLL文件
- RealView 编译工具 库和浮点支持指南
- android学习笔记----类似微信的TabHost
- 提升电话交流中的感染力
- Java 1.7 里有什么?
- sqlite数据库支持中文路径问题
- linux内核中Kconfig文档的作用
- joomla中css 下拉菜单的制作
- oracle日期函数收集