C#调用C++的Dll的方法

屋顶上的老猫 2012-02-13 10:31:52
以前用C++写了个Dll,内含枚举、结构体及若干函数。现在需要在C#内调用此Dll,在网上查了一些资料,对C#不了解,没有针对性看着迷糊,向各位达人求助!

Dll内“.h”文件数据及方法定义如下:

//枚举
typedef struct _AesCtx_
{
unsigned char space[372];
} AesCtx;

//结构体
typedef enum _AES_BLOCK_MODE_
{
BLOCKMODE_ECB = 0,
BLOCKMODE_CBC ,
BLOCKMODE_PCBC ,
BLOCKMODE_OFB ,
BLOCKMODE_CFB ,
BLOCKMODE_CRT
} BlockMode;

//Dll内的方法之一
extern void AesSetKey( AesCtx * pContext , int iBlockMode, void * key , void * initialVector );

问题1:如何用C#的数据类型改写上述定义?
问题2:以上面AesSetKey为例,如何使用C#对Dll内的方法进行调用?

给出大体方法即可,及调用过程中的注意事项,多谢!
...全文
103 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
屋顶上的老猫 2012-02-14
  • 打赏
  • 举报
回复
谢谢各位,问题已解决!
段传涛 2012-02-13
  • 打赏
  • 举报
回复
原来学习的。
参考 http://www.cnblogs.com/my-blog/archive/2008/11/14/1333454.html
ccccffff 2012-02-13
  • 打赏
  • 举报
回复
p/invoke方法。
注意C++到C#的类型变化,方法名跟参数类型必须一致,弄错了,就不对了。
比如
贴个C++的例子给你看看,你参照着做把。
ULONG Test_Func{
const unsigned char* pucDir,
const unsigned char* pucFile,
LPCTSTR lpDstDir,
LPCTSRT lpDstFile
};

用C#来写的话,就是下面的
[DllImport("dll文件名")]
public Int32 Test_Func(byte[] pucDstDir, byte[] pucDstFile, string lpSrcDir, string lpSrcFile)
{
}

mqtheone 2012-02-13
  • 打赏
  • 举报
回复
把c++ 的 dll 引入到 你的c# 工程项目里面呢?
wenbin 2012-02-13
  • 打赏
  • 举报
回复
AesCtx 结构体中的char,在C#中需要使用byte
BlockMode直接复制过去即可
key
initialVector 这两个是void指针,具体是什么,只有你自己晓得了


参数输入输出时需要使用ref
仅仅输出使用out
输入则无需使用
希望有些帮助^_^
屋顶上的老猫 2012-02-13
  • 打赏
  • 举报
回复
回楼上,链接我看了,不希望对dll进行任何改动,在网上找了份资料,是通过封装loadLibrary用函数指针来进行调用,传参的部分太麻烦了,还有其他简单可靠的调用方法吗?
nonocast 2012-02-13
  • 打赏
  • 举报
回复
这篇不错,参考一下
http://www.cnblogs.com/grapeot/archive/2010/01/25/1656240.html
WAN 2012-02-13
  • 打赏
  • 举报
回复
lz可以试一下:
        [StructLayout(LayoutKind.Sequential)]
public struct AesCtx
{
//指定AesCtx结构的封送处理
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 372)]
public byte[] space;
}

public enum BlockMode
{
BLOCKMODE_ECB = 0,
BLOCKMODE_CBC,
BLOCKMODE_PCBC,
BLOCKMODE_OFB,
BLOCKMODE_CFB,
BLOCKMODE_CRT
}

public class LibWrap
{
//ref指示使用引用传递数组,可输入及输出
//[In]指示使用仅可输入的值传递,可省略
//key和initialVector直接定义为数组,Interop会进行默认封送处理
[DllImport("MyDll.dll")]
public static extern void AesSetKey(ref AesCtx aesCtx, [In] BlockMode blockMode, [In] byte[] key, [In] byte[] initialVector);
}

static void Main(string[] args)
{
AesCtx aesCtx = new AesCtx();
aesCtx.space = new byte[372];

byte[] key = new byte[1];

byte[] initialVector = new byte[1];

LibWrap.AesSetKey(ref aesCtx, BlockMode.BLOCKMODE_ECB, key, initialVector);
}

应该不需要过多的解释,看完大概就明白了
屋顶上的老猫 2012-02-13
  • 打赏
  • 举报
回复
补充,第1个参数为输出,第2、3、4参数为输入,C#里需要加什么关键字吗?

extern void AesSetKey( AesCtx * pContext , int iBlockMode, void * key , void * initialVector );
屋顶上的老猫 2012-02-13
  • 打赏
  • 举报
回复
补充,对于下面2个参数,如果传入无符号的字符数组unsigned char m_key[],在C#内应该怎么写?

void ×key
void *initialVector

多谢!
屋顶上的老猫 2012-02-13
  • 打赏
  • 举报
回复
to jason_dct:

我已经按此链接完成LoadDll的载入,不过如何通过invoke具体进行调用还是不太明白,尤其是传参部分的处理,比如Dll内的这个函数,如下:

extern void AesSetKey( AesCtx * pContext , int iBlockMode, void * key , void * initialVector );

上面方法内的4个参数,根据此链接内容应该如何处理?能给具体讲讲吗?
多谢!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧