dll的参数 有函数int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);在C#中调用[DllImport("MWRF32.dll", EntryPoint = "rf_card")]//下一句该怎么写?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private static extern int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr); 为了能用上原来的C++代码,只好研究下从C# 中调用DLL首先必须要有一个声明,使用的是DllImport关键字: 包含DllImport所在的名字空间 using System.Runtime.InteropServices; public class XXXX{[DllImport(“MyDLL.dll")] public static extern int mySum (int a,int b); } [DllImport(“MyDLL.dll")] public static extern int mySum (int a,int b); 代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中 在调用的时候 在类中的时候 直接 mySum(a,b);就可以了 在其他类中调用: XXXX. mySum(a,b); [DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性 [DllImport(“MyDLL.dll", EntryPoint=" mySum ",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall) ] EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。 CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE) CallingConvention指示入口点的函数调用约定(默认WINAPI)(上次报告讲过的) SetLastError 指示被调用方在从属性化方法返回之前是否调用 SetLastError Win32 API 函数 (C#中默认false ) int 类型 [DllImport(“MyDLL.dll")] //返回个int 类型 public static extern int mySum (int a1,int b1); //DLL中申明 extern “C” __declspec(dllexport) int WINAPI mySum(int a2,int b2) { //a2 b2不能改变a1 b1//a2=..//b2=...return a+b; } //参数传递int 类型 public static extern int mySum (ref int a1,ref int b1); //DLL中申明 extern “C” __declspec(dllexport) int WINAPI mySum(int *a2,int *b2) { //可以改变 a1, b1*a2=...*b2=...return a+b; } DLL 需传入char *类型 [DllImport(“MyDLL.dll")] //传入值 public static extern int mySum (string astr1,string bstr1); //DLL中申明 extern “C” __declspec(dllexport) int WINAPI mySum(char * astr2,char * bstr2) { //改变astr2 bstr 2 ,astr1 bstr1不会被改变return a+b; } DLL 需传出char *类型 [DllImport(“MyDLL.dll")] // 传出值public static extern int mySum (StringBuilder abuf, StringBuilder bbuf ); //DLL中申明 extern “C” __declspec(dllexport) int WINAPI mySum(char * astr,char * bstr) { //传出char * 改变astr bstr -->abuf, bbuf可以被改变return a+b; } DLL 回调函数 BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); //定义委托函数类型 public class EnumReportApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is "); Console.WriteLine(hwnd); return true; } } DLL 传递结构 BOOL PtInRect(const RECT *lprc, POINT pt); using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct Point {public int x; public int y;} [StructLayout(LayoutKind.Explicit)] public struct Rect { [FieldOffset(0)] public int left; [FieldOffset(4)] public int top;[FieldOffset(8)] public int right; [FieldOffset(12)] public int bottom;} Class XXXX { [DllImport("User32.dll")] public static extern bool PtInRect(ref Rect r, Point p); } To jetxia,C#中没有unsigned char 和unsigned long啊 To jetxia,C#中没有unsigned char 和unsigned long*啊 private static extern Int32 rf_card(Int32 icdev, Char _Mode, IntPtr Snr); 一看就知道lz是要写串口读卡器的 :D 哈,是要读IC卡卡号 [DllImport("MWRF32.dll", EntryPoint = "rf_card")]//public static extern int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr); private static extern Int32 rf_card(Int32 icdev, byte _Mode, IntPtr Snr); // int rf_init(int port, long baud); [DllImport("MWRF32.dll", EntryPoint = "rf_init")] private static extern Int32 rf_init(Int32 port, Int32 baud); [DllImport("MWRF32.dll", EntryPoint = "rf_init")] public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Int32 icdev; icdev = rf_init(0, 115200); MessageBox.Show(icdev.ToString()); Int32 st; IntPtr Snr = new IntPtr(); st=rf_card(icdev,(byte)0,Snr); MessageBox.Show(Snr.ToString()); }icdev = rf_init(0, 115200);这句运行没问题,返回一个正值运行到st=rf_card(icdev,(byte)0,Snr);出现内存读异常提示感觉这句我写得有问题,虽然编译通过了函数原型注释有,大家帮着看看.要用unsafe吗,还是? 如何访问项目文件夹中的文件? FindProxyForURL很慢。有什么解决的方案? 求助一个问题? 如何让sql2000生成xml文件或网页? 调用dll卡死,程序无响应问题 帮忙大概解释下rational rose和UML 评选最受欢迎的软件!! DATASET输出XML 在sql server中多条sql命令可以用分号隔开,access怎么做? .net UpdatePanel获取Request.Files? 文件未找到 HTTP404错误 求检查是否包含非法词语的正则写法,是否比用indexof这种方法快......
首先必须要有一个声明,使用的是DllImport关键字:
包含DllImport所在的名字空间
using System.Runtime.InteropServices;
public class XXXX{[DllImport(“MyDLL.dll")]
public static extern int mySum (int a,int b);
}
[DllImport(“MyDLL.dll")]
public static extern int mySum (int a,int b);
代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中
在调用的时候
在类中的时候 直接 mySum(a,b);就可以了
在其他类中调用: XXXX. mySum(a,b); [DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性
[DllImport(“MyDLL.dll", EntryPoint=" mySum ",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)
]
EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。
CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE)
CallingConvention指示入口点的函数调用约定(默认WINAPI)(上次报告讲过的)
SetLastError 指示被调用方在从属性化方法返回之前是否调用 SetLastError Win32 API 函数 (C#中默认false )
int 类型
[DllImport(“MyDLL.dll")]
//返回个int 类型
public static extern int mySum (int a1,int b1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(int a2,int b2)
{
//a2 b2不能改变a1 b1
//a2=..
//b2=...
return a+b;
}
//参数传递int 类型
public static extern int mySum (ref int a1,ref int b1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(int *a2,int *b2)
{
//可以改变 a1, b1
*a2=...
*b2=...
return a+b;
}
DLL 需传入char *类型
[DllImport(“MyDLL.dll")]
//传入值
public static extern int mySum (string astr1,string bstr1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(char * astr2,char * bstr2)
{
//改变astr2 bstr 2 ,astr1 bstr1不会被改变
return a+b;
}
DLL 需传出char *类型
[DllImport(“MyDLL.dll")]
// 传出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf );
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(char * astr,char * bstr)
{
//传出char * 改变astr bstr -->abuf, bbuf可以被改变
return a+b;
} DLL 回调函数 BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) using System;
using System.Runtime.InteropServices;
public delegate bool CallBack(int hwnd, int lParam); //定义委托函数类型
public class EnumReportApp
{
[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
public static void Main() {
CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0);
}
public static bool Report(int hwnd, int lParam)
{
Console.Write("Window handle is ");
Console.WriteLine(hwnd); return true;
}
}
DLL 传递结构
BOOL PtInRect(const RECT *lprc, POINT pt); using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct Point {
public int x;
public int y;
}
[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}
Class XXXX {
[DllImport("User32.dll")]
public static extern bool PtInRect(ref Rect r, Point p);
}
C#中没有unsigned char 和unsigned long啊
C#中没有unsigned char 和unsigned long*啊
//public static extern int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);
private static extern Int32 rf_card(Int32 icdev, byte _Mode, IntPtr Snr);
// int rf_init(int port, long baud);
[DllImport("MWRF32.dll", EntryPoint = "rf_init")]
private static extern Int32 rf_init(Int32 port, Int32 baud);
[DllImport("MWRF32.dll", EntryPoint = "rf_init")]
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Int32 icdev;
icdev = rf_init(0, 115200);
MessageBox.Show(icdev.ToString()); Int32 st;
IntPtr Snr = new IntPtr();
st=rf_card(icdev,(byte)0,Snr);
MessageBox.Show(Snr.ToString());
}icdev = rf_init(0, 115200);这句运行没问题,返回一个正值
运行到st=rf_card(icdev,(byte)0,Snr);出现内存读异常提示
感觉这句我写得有问题,虽然编译通过了
函数原型注释有,大家帮着看看.
要用unsafe吗,还是?