首先为父亲准备一个蛋糕
祝愿父亲身体健康万事顺心感谢生命中有你老爸你辛苦了
附带几张庆祝的照片觉得这个说说怎么样
第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:
LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 导入定义:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中调用测试:
int iSum = RefComm.mySum(,);
运行查看结果iSum为5,调用正确。第一步试验完成,说明在C#中能够调用自定义的动态链接库函数。
第二步,我定义了字符串操作的函数(简单起见,还是采用前面的函数名),返回结果为字符串:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 导入定义:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中调用测试:
string strDest="";
string strTmp= RefComm.mySum("45", strDest);
运行查看结果 strTmp 为"45",但是strDest为空。我修改动态链接库实现,返回结果为串b:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 导入定义,将串b修改为ref方式:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再调用测试:
string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中再调用测试:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
运行查看结果 strTmp 为"45",但是串 strDest 没有赋值。第二步实现函数返回串,但是在函数出口参数中没能进行输出。再次修改 C# 导入定义,将串b修改为引用(ref):
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
运行时调用失败,不能继续执行。
第三步,修改动态链接库实现,将b修改为双重指针:
LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;}
C#导入定义:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中调用测试:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均为"45",调用正确。第三步实现了函数出口参数正确输出结果。
第四步,修改动态链接库实现,实现整数参数的输出:
LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;}
C#导入的定义:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中调用测试:
int c=0;
int iSum= RefComm. mySum(,, ref c);
运行查看结果iSum 和c均为5,调用正确。
经过以上几个步骤的试验,基本掌握了如何定义动态库函数以及如何在 C# 定义导入,有此基础,很快我实现了变长加密函数在 C# 中的调用,至此目标实现。
三、结论
在 C# 中调用 C++ 编写的动态链接库函数,如果需要出口参数输出,则需要使用指针,对于字符串,则需要使用双重指针,对于 C# 的导入定义,则需要使用引用(ref)定义。
对于函数返回值,C# 导入定义和 C++ 动态库函数声明定义需要保持一致,否则会出现函数调用失败。定义导入时,一定注意 CharSet 和 CallingConvention 参数,否则导致调用失败或结果异常。运行时,动态链接库放在 C# 程序的目录下即可,我这里是一个 C# 的动态链接库,两个动态链接库就在同一个目录下运行。
1) 父爱如水,母爱如山,我们家不一样的父爱母爱,也为我和弟弟撑起了一方晴空,铺成了一条通往幸福的道路,那条路上满满的都是爱。
2) 我不是诗人,也不是歌唱家,既不会用精湛的词藻来赞扬父母,也不会用唯美动听的音乐来歌赞父母,我只能用点滴行动来感恩父母。
3) 从嗷嗷待哺到蹒跚学步,从玩耍学习到为人处事,我们成长的每一步都凝聚着父母无穷无尽的爱。这种爱无微不至,永恒不息!人世间最伟大的爱莫过于父母之爱,它是无私的付出,不求回报的辛劳。
4) 感恩父母,感谢他们给予了我们生命,感谢他们给予了我们人间最浓的亲情和最深的挂念,给了我们无尽的爱,他们教会了我们人生中的许多第一,是他们教会了我们走出第一步,是他们教会了我们说第一句话,是他们教会了我们第一个字,如果没有亲爱的父母,就没有我们的存在。
5) 我感恩我的父母,是他们给予我的生命,给我一个温暖的家,坚实而温馨的避风港成为我栖息的地方。爸爸您是女儿心中安全而温暖的靠山,累了的时候在上面躺一躺,就会让我精神百倍;爸爸您是女儿心中那辽阔的海洋的彼岸,在岸的那头等待着女儿的归来;爸爸您是女儿心中的太阳,那耀眼的光芒驱走了女儿心中的阴影
http://vhead.blog.sina.com.cn/player/outer_player.swf?auto=1&vid=4494192&uid=1411913627
http://www.wallcoo.com/cartoon/vector_art_for_father_day_1680/html/wallpaper16.html 这里有
http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&fr=ala0&pv=&word=%B8%B8%C7%D7%BD%DA%BF%A8%CD%A8%B1%DA%D6%BD&z=0&fm=rs1&rst=0
http://www.nipic.com/show/4/104/d7d17dec744d1e02.html http://www.nipic.com/show/1/18/c078b44e9e9582e2.html http://www.nipic.com/show/1/11/8c90702e180c0050.html http://www.nipic.com/show/1/11/a6b7c56c0e05aa59.html
在我的家庭中,有暴力的爸爸,调皮的我,凶巴巴的妈妈,和蔼可亲的姥姥,四人一起生活得很好,当然也少不了偶尔的吵架.那天,是劳动节,爸爸妈妈带我到云洞岩风景区爬山.我高高兴兴地回来后,突然,只听见爸爸叫我写作文,我皱着眉头偷偷地瞧了爸爸一眼,只见他瞪着一双大大的眼睛看着我,像个魔鬼.我连忙跑进书房,趴在书桌上抱着脑袋心想:作文作文,那个“魔鬼”整天就知道叫我写作文,现在,我只要一听见要写作文,脑袋就变得大大的.我望了望窗外,只看见鸟儿们成群结队悠闲自在地在天空中展翅高飞,心想:如果我是一只能展翅高飞、自由自在的鸟儿就好了,我就能在天空中翱翔,飞到世界各地,就不用整天挨家长的骂.哪怕用生命去交换我也愿意.唉!想来想去,我就是想不出要写什么呢?于是,就拿起笔随便地写了起来,很快,我的作文写完了.只听见门外“咚咚咚……”的敲门声,爸爸走进来了,他随手拿起我的作文一看,生气了,一个响亮的耳光落到了我的脸上.顿时,我的脸上火辣辣的,不禁哇哇大哭,爸爸就更火了,他的眼睛里似乎要喷射出火花一样,十分恐怖.他又举起了“五爪”在我的脸上挥了几下,顿时,我的脸肿得大大的,哭声越来越响,竟然传到了“耳聋”姥姥的耳朵里.她急忙跑进书房一看,原来是我们这两个“冤家”在吵架哩!姥姥连忙过去劝阻那个“魔鬼”,可是“魔鬼”却说:“我们父女俩的事不用你这老太婆来搅和,赶快出去.”姥姥不但没劝着,而且还被那个“魔鬼”狠狠地骂了一顿.过了一会儿,那个“魔鬼”的气“消化”了许多.便用他的“五爪”拧起我的脖子,气呼呼地朝大门走去,把我甩在门外,“叭”地关上门.我又哭又闹地“躺”在门口,心想:作文写不好,能全怪我吗?你这个狠心的“魔鬼”不但没有耐心教我,而且就知道整天打人、骂人,真是不可理喻.小吵小闹的事是很多的,但这次的吵闹是最厉害的,而且还深深地伤了我的自尊心.这场风波至今还刻在我的心里,真希望爸爸能变得温柔些!