首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 调用DLL 参数有关问题

2012-04-06 
c# 调用DLL 参数问题我现在遇到一个问题。 是调用一个dll。 发现其参数是有指针。不知道应该如何写。int FL_Ge

c# 调用DLL 参数问题
我现在遇到一个问题。 是调用一个dll。 发现其参数是有指针。不知道应该如何写。

int FL_GetFea(int nAddr, unsigned char* pTemplet, int* iTempletLength);



我改写成下面那样出现了错误

 public static extern int FL_GetFea(int nAddr, IntPtr pTemplet, IntPtr iTempletLength);
   
  int fl_GetFea(int nAddr, string pTemplet, int iTempletLength)
  {
  return FL_GetFea(nAddr, pTemplet, iTempletLength);
  }

[解决办法]
等待学习
[解决办法]
试试参数用ref。
[解决办法]
引自:http://blog.csdn.net/ghlfllz/archive/2010/10/10/5931291.aspx

有两种办法在C#中调用C++写的DLL的方法有两种:

1、COM

将C++代码封装成COM,然后在C#中引用

2、API

将C++代码封装成C接口的函数,类似于Windows的API,然后在C#中通过DllImport引用

例如:

c++头文件为

int _stdcall Decrypt(unsignec char *src, unsigned long src_len, unsigned char **dst, unsigned long *dst_len);

注:在*.def文件中需呀为定义Decrypt的导出

在c#中引用如下命名空章

using System.Runtime.InteropServices;

在某个类的构造函数后面添加:

[DllImport("CryptTools.dll")]

internal static extern int Decrypt(System.IntPtr src, int src_len, ref System.IntPtr dst, ref int dst_len);

添加函数封装对该API的调用:

internal static int Sharp_Decrypt(byte[] src, ref byte[] dst)

{

int result = -1, dstLen = 0;

IntPtr pSrc = Marshal.AllocHGlobal(src.Length);

Marshal.Copy(src, 0, pSrc, src.Length);

IntPtr pDst = IntPtr.Zero;

result = Decypt(pSrc, src.Length, ref pDst, ref dstLen);

if (0 == result)

{

dst = new byte[dstLen];

Marshal.Copy(pDst, dst, 0, dstLen);

}

Marshal.FreeHGlobal(pSrc);

return result;

}

请注意,出于篇幅的考虑,此处没有在CryptTools.dll中添加unsigned char**的释放函数,需要读者自行添加。
[解决办法]
int FL_GetFea(int nAddr, unsigned char* pTemplet, int* iTempletLength);
第二个参数是一个字符串指针,应该是用来写数据的
第三个参数在传入的时候应该是指明第二个参数的长度,在传出的时候指明实际写了多少字节数据
试试这样:
int aAddr;
StringBuilder sb = new StringBuilder(256);
int length = 256;
GetFea(nAddr, sb, ref length);
[解决办法]
等待学习中
[解决办法]
我对最后一个参数的方法有误,写了点代码测试了一下:
C/C++ Dll代码:

C/C++ code
#include "stdafx.h"#include <stdio.h>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的容量}
[解决办法]
C# code
 [DllImport()] public static extern int FL_GetFea(int nAddr,ref byte[] pTemplet,ret int iTempletLength);pTemplet, iTempletLength 可能是输入参数。 你看看API, 

热点排行