日期:2014-05-17  浏览次数:21132 次

C#调用dll文件 跪求L
文件一共有三个:dcrf32.dll、dcrf32.h、dcrf32.lib
如果是VC++的人员编程的话就把dcrf32.lib加入到工程>设置 链接功能块就行了,他们就可以编其他功能了
可是小弟我只会编VC#。


下面是一些代码,我来请教各位大侠、高手们!!!
头文件dcrf32.h里:
#define uc unsigned char
extern "C"
{
//1.
HANDLE  __stdcall  dc_init(__int16 port,long baud);//链接串口
//2.
__int16  __stdcall dc_exit(HANDLE icdev);
//3.
__int16  __stdcall dc_config(HANDLE icdev,unsigned char _Mode,unsigned char _Baud);

... ...
解释一下:int  dc_init(int port,long baud);

功 能:初始化通讯口

参 数:port:取值为0~19时,表示串口1~20;为100时,表示USB口通讯,此时波特率无效。

       baud:为通讯波特率9600~115200

返 回:成功则返回串口标识符>0,失败返回负值,见错误代码表

   例:int icdev;

       icdev=dc_init(0,9600);//初始化串口1,波特率9600


----------------------------------------------------

dcrf32.dll文件没打开过。

我用C#调用,用以下方发会出现异常(“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”)。但开始没有语法错误的
        [DllImport("dcrf32.dll")]
        public static extern IntPtr dc_init(int port, long baud);

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr re = dc_init(100, 0);//按按钮“链接串口”的时候出错了<-这句出错:试图加载格式不正确的程序。
        }


请大家指教。

------解决方案--------------------
int16就是int16,c语言的int和long都是int32
c#的long好像是int64了吧
------解决方案--------------------
public static extern IntPtr dc_init(int port, long baud);
上面是_int16这里用int肯定不对,用short port试试
------解决方案--------------------
extern "C"
{
//1.
HANDLE __stdcall dc_init(__int16 port,long baud);//链接串口
//2.
__int16 __stdcall dc_exit(HANDLE icdev);
//3.
__int16 __stdcall dc_config(HANDLE icdev,unsigned char _Mode,unsigned char _Baud);

... ...
解释一下:int dc_init(int port,long baud);


_int16 = short
unsigned char = byte
long = int
HANDLE = IntPtr

 再试。
记得用GetLastErr()

------解决方案--------------------
 [DllImport("dcrf32.dll")]
  public static extern IntPtr dc_init(int port, long baud);

应该把long该成int就行
一个参数最少也得4字节,虽然那边要的是__int16,但还是占用4个字节,你传4个字节过去也不会出错
而c语言long要4个字节,c# long是8个字节
------解决方案--------------------
可能程序的32位和服务器的版本可能不一样。
参考
------解决方案--------------------
楼主把dll复制到生成目录里
就是\bin\debug\
------解决方案--------------------
[DllImport("dcrf3