2017-05-03 17:34:00 diwuci123 阅读数 128
  • 基于WCF构建企业级大型分布式SOA架构(初级篇)

    学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁在用?——微软、腾讯、网易、戴尔、当当网、携程、招商银行、中国知网、申通快递、房天下、汽车之家等。微软在软件行业的龙头老大位置没有任何人能够否认,它总是站在开发技术的前沿。如今微软正高举.NET大旗继续向前,他正努力使开发变得更加轻松。 学习目标  1、让学员熟练掌握WCF的核心概念及相关编程技能,对WCF技术有一个全面的、深入的、系统的了解;  2、让学员对SOA架构设计的思想和方式具有初步的认识, 对后期我们将要学习的SOA架构有一个宏观的了解;  3、让学员通过完整的示例的学习, 能够 熟练搭建开发环境, 服务构建,服务配置,服务调试、服务单元测试, Restful服务的编写, 客户端代理的编写、各种应用程序中消费使用服务等;  4、通过 项目实战让学员达到1-3年工作经验水平。达到.NET软件工程师,.Net/C#研发工程师、中高级工程师等岗位所需技能; 课程简介 专注15年C#/.Net开发、 科研,在多个中大型企业中负责过多个中大型项目的架构设计、开发、实施部署,积累丰富的研发及实践经验,为 Net学习者快速掌握.Net企业级开发常用技术及架构,录制本视频课程系列(分为初级篇,中级篇,高级篇三大课程), 采用实战项目从0开始一步步讲授如何搭建项目架构及分析各技术的优劣,提供系统/示例完整源码(价值高)及详细上课日志,及时为您解惑答疑,让课程价值无限; 无论您是Java、C++、Python还是其它语言的开发者 ,都可以学习本系列课程,因为这种架构设计思想和方式对任何语言来说是一样的,只是实现的技术、语言不一样而已;纯干货, 含金量高,价格实惠,物超所值 ,配套的项目架构源码等均能直接应用于实际项目开发中;        课程特色        1:课程设计循序渐进,讲解细致,通俗易懂,由浅入深, 非常适合自主学习;        2:以PPT为大纲,教学过程示例丰富,强调技术关键点,并且分析透彻; 先概念后示例再应用实践;        3:物美价廉,本着知识共享,帮助更多有需求者原则,毫无保留,此外,提供源代码/示例代码+课程资料+课程相关工具+答疑; 问答环节一对一辅导,让学员学习不再困难,为想学习提升的学员提供更多的指导,欢迎试听; 本课程示例程序解决方案 SOA架构部署图(中级篇) SOA架构特色 (中级篇) SOA架构解决方案(中级篇) 与SOA架构配合开发的Web实战项目解决方案(中级篇) 教学理念        1:把需要工作的人变成工作需要的人;        2:创设立足学员,突出项目,强化技术,提高能力的教学局面; 注意 1.开发环境VS2015、Eclipse、Sql Server 2008R2; 2.赠送配套资料:详细注释的示例项目源码、详实的讲义等; 3.由初级篇—中级篇—高级篇,建议按顺序一节节学习,一节节理解;从而快速实现架构师之梦;

    378 人正在学习 去看看 刘长青
C++中的方法int MyFun(int a,int b);
生成dll文件:MyDll.dll

在C#中调用dll文件一般需要声明:
[DllImport("MyDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int MyFun( int a, int b);
这样想动态来加载dll没办法操作。

后来在网上查了下,有两种方式能够动态的加载dll,不用声明:

先准备好DllInvoke类

public class DllInvoke
{
#region Win API
[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(string path);

[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);

[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib);
#endregion

private IntPtr hLib;
public DllInvoke(String DLLPath)
{
hLib = LoadLibrary(DLLPath);
if (hLib == IntPtr.Zero)
{
throw (new Exception("没有找到:" + DLLPath + "。"));
}
}

~DllInvoke()
{
FreeLibrary(hLib);
}
public IntPtr GetIntPtr(string APIName)
{
IntPtr api = GetProcAddress(hLib, APIName);
if (api == IntPtr.Zero)
{
throw (new Exception(" 没有找到 :" + APIName + " 这个函数的入口点 "));
}
return api;
}
//将要执行的函数转换为委托
public Delegate GetDelegate(string APIName, Type t)
{
IntPtr api =GetIntPtr(APIName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
}
}



方法一:

delegate int Add(IntPtr[] X, int r, int c);


DllInvoke dk = new DllInvoke("MyDll.dll");
Add addFunction = (Add)dk.GetDelegate("MyFun", typeof(Add));
int sum=addFunction(2,3);



方法二:

object[] par = new object[] {2,3 };//输入参数
Type[] parType = par.Select(s=>s.GetType()).ToArray();//输入参数的类型
//Type[] parType =new Type[]{typeof(int),typeof(int)};
Type Type_Return = typeof(int); // 返回类型

AssemblyName assemblyName = new AssemblyName("InvokeName");//名称随便写
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("InvokeModule");
MethodBuilder methodBuilder = moduleBuilder.DefineGlobalMethod("InvokeMethod", MethodAttributes.Public | MethodAttributes.Static, Type_Return, parType);
ILGenerator IL = methodBuilder.GetILGenerator();
for (int i = 0; i < par.Length; i++)
{// 依次压入堆栈
IL.Emit(OpCodes.Ldarg, i); //实参传送方式,byValue
// IL.Emit(OpCodes.Ldarga, i);//实参传送方式,byRef
}
//要调用的dll
DllInvoke dk = new DllInvoke("MyDll.dll");
//调用的方法
IntPtr farProc = dk.GetIntPtr("MyFun");
if (IntPtr.Size == 4)
{// 判断处理器类型
IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32());
}
else if (IntPtr.Size == 8)
{
IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64());
}
else
{
throw new PlatformNotSupportedException();
}
IL.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, Type_Return, parType);
IL.Emit(OpCodes.Ret);
moduleBuilder.CreateGlobalFunctions();
//方法名和上面的一致
MethodInfo MyMethodInfo = moduleBuilder.GetMethod("InvokeMethod");
object sum = MyMethodInfo.Invoke(null, par);// 调用方法,并返回其值

2018-01-07 23:32:02 C_xxy 阅读数 1326
  • 基于WCF构建企业级大型分布式SOA架构(初级篇)

    学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁在用?——微软、腾讯、网易、戴尔、当当网、携程、招商银行、中国知网、申通快递、房天下、汽车之家等。微软在软件行业的龙头老大位置没有任何人能够否认,它总是站在开发技术的前沿。如今微软正高举.NET大旗继续向前,他正努力使开发变得更加轻松。 学习目标  1、让学员熟练掌握WCF的核心概念及相关编程技能,对WCF技术有一个全面的、深入的、系统的了解;  2、让学员对SOA架构设计的思想和方式具有初步的认识, 对后期我们将要学习的SOA架构有一个宏观的了解;  3、让学员通过完整的示例的学习, 能够 熟练搭建开发环境, 服务构建,服务配置,服务调试、服务单元测试, Restful服务的编写, 客户端代理的编写、各种应用程序中消费使用服务等;  4、通过 项目实战让学员达到1-3年工作经验水平。达到.NET软件工程师,.Net/C#研发工程师、中高级工程师等岗位所需技能; 课程简介 专注15年C#/.Net开发、 科研,在多个中大型企业中负责过多个中大型项目的架构设计、开发、实施部署,积累丰富的研发及实践经验,为 Net学习者快速掌握.Net企业级开发常用技术及架构,录制本视频课程系列(分为初级篇,中级篇,高级篇三大课程), 采用实战项目从0开始一步步讲授如何搭建项目架构及分析各技术的优劣,提供系统/示例完整源码(价值高)及详细上课日志,及时为您解惑答疑,让课程价值无限; 无论您是Java、C++、Python还是其它语言的开发者 ,都可以学习本系列课程,因为这种架构设计思想和方式对任何语言来说是一样的,只是实现的技术、语言不一样而已;纯干货, 含金量高,价格实惠,物超所值 ,配套的项目架构源码等均能直接应用于实际项目开发中;        课程特色        1:课程设计循序渐进,讲解细致,通俗易懂,由浅入深, 非常适合自主学习;        2:以PPT为大纲,教学过程示例丰富,强调技术关键点,并且分析透彻; 先概念后示例再应用实践;        3:物美价廉,本着知识共享,帮助更多有需求者原则,毫无保留,此外,提供源代码/示例代码+课程资料+课程相关工具+答疑; 问答环节一对一辅导,让学员学习不再困难,为想学习提升的学员提供更多的指导,欢迎试听; 本课程示例程序解决方案 SOA架构部署图(中级篇) SOA架构特色 (中级篇) SOA架构解决方案(中级篇) 与SOA架构配合开发的Web实战项目解决方案(中级篇) 教学理念        1:把需要工作的人变成工作需要的人;        2:创设立足学员,突出项目,强化技术,提高能力的教学局面; 注意 1.开发环境VS2015、Eclipse、Sql Server 2008R2; 2.赠送配套资料:详细注释的示例项目源码、详实的讲义等; 3.由初级篇—中级篇—高级篇,建议按顺序一节节学习,一节节理解;从而快速实现架构师之梦;

    378 人正在学习 去看看 刘长青

C++高效灵活,适用于编写较为复杂的算法;而C#简单易用,容易做出优美宜人的界面。因此,将它们结合起来是一个不错的选择!关于这个命题,在大二刚学C#时就有想过,不过一直没有去做。如今,大学将毕,正好在毕设的需求下,收集资料作了一番学习现在此做个备忘吧!

(一)项目整体框架:

整合收集的资料和自己以往所学的知识,我将整个“C#使用C++生成的DLL”解决方案分成三个部分:①C++生成DLL项目;②调用DLL的中间桥梁类库—.NET基本组件(以类库形式封装的类、对象);③使用DLL的C#窗体程序。编程时,可以先创建一个解决方案,再逐渐将三个项目添加进去。如下图所示:
这里写图片描述

(二)涉及主要知识点:

(1)C的编译预处理知识:①宏定义(#define);②文件包含(#include)等。
(2)创建.NET基本组件(类与对象构成)并通过引用使用之(本文将之作为调用DLL的中间桥梁);
(3)设置导出函数格式:extern "C" _declspec(dllexport) 函数类型 _stdcall 函数名(参数列表)(采用C风格!)
(4)DLL的C#调用入口点:[DllImport(@"C++生成的DLL最终绝对路径",CallingConvention =CallingConvention.StdCall,CharSet =CharSet.Ansi,EntryPoint ="Area", ExactSpelling = false,SetLastError = true)]

(三)步骤详解:

【示例使用VS2015专业版】
(1)创建一个空的解决方案:新建项目→其他项目类型→
VS解决方案→输入方案名称MySolution_01→选择路径并保存。
这里写图片描述
(2)创建C++编写的DLL项目MyDLL:
1)创建MyDLL项目:右键上一步创建的解决方案→添加→新建项→ VisualC ++ →Win32项目→输入名称→确定→选DLL→完成。
这里写图片描述这里写图片描述这里写图片描述
2)写入代码:
备注:不管是在“头文件”还是“源文件”中添加子项,都是通过:右键→添加→新建项】
这里写图片描述
①包含自定义头文件MyInclude.cpp:建立一个文本并放在解决方案文件夹中→改后缀为.cpp/.c等→VS打开并添加如图所示代码。【这一步不必要,是我自己增加的!】
这里写图片描述写入代码保存后,在stdafx.h(头文件下自动创建的)中将MyInclude.cpp包含进去:
这里写图片描述
②添加函数导出格式头文件DLLExport.h(需按照2)下的备注所说先创建此文件再添加代码):
这里写图片描述
③C++DLL(算法)主要代码MyDLL.cpp:
这里写图片描述
④在“源文件”中添加“模块文件”NameDLL.def(确保导出函数名及入口点函数不变):
这里写图片描述

(3)创建调用中间过度类库DLL_BridgeClass:
1)创建项目DLL_BridgeClass:右键解决方案→添加→新建项→ VisualC# →类库→输入类库名称→确定。
这里写图片描述
2)写入代码:
这里写图片描述

(4)创建调用DLL的C#窗体程序UseMyDLL:
1)创建项目UseMyDLL:右键解决方案→添加→新建项→ VisualC# →Windows窗体应用程序→输入名称UseMyDLL→确定。

2)写入代码:
代码应对照设计的窗体看,就可以很清晰了!
这里写图片描述
这里写图片描述
3)运行结果:
这里写图片描述

(四)关键点集合:

(1)3个项目中相关函数的签名应该完全一样!
(2)注意“函数导出格式”和“DLL的C#调用入口点”书写格式。
(3)“DLL的C#调用入口点”:[DllImport(@"C++生成的DLL最终绝对路径",CallingConvention =CallingConvention.StdCall,CharSet =CharSet.Ansi,EntryPoint ="Area", ExactSpelling = false,SetLastError = true)],请注意C++项目不管是用Release还是Debuge模式进行调试(这里一般用Release模式),DllImport(“”)这里要用最终MyDLL.dll的绝对路径才不会出错(可以去项目文件里查看)!

2011-03-07 23:39:00 victorye81 阅读数 829
  • 基于WCF构建企业级大型分布式SOA架构(初级篇)

    学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁在用?——微软、腾讯、网易、戴尔、当当网、携程、招商银行、中国知网、申通快递、房天下、汽车之家等。微软在软件行业的龙头老大位置没有任何人能够否认,它总是站在开发技术的前沿。如今微软正高举.NET大旗继续向前,他正努力使开发变得更加轻松。 学习目标  1、让学员熟练掌握WCF的核心概念及相关编程技能,对WCF技术有一个全面的、深入的、系统的了解;  2、让学员对SOA架构设计的思想和方式具有初步的认识, 对后期我们将要学习的SOA架构有一个宏观的了解;  3、让学员通过完整的示例的学习, 能够 熟练搭建开发环境, 服务构建,服务配置,服务调试、服务单元测试, Restful服务的编写, 客户端代理的编写、各种应用程序中消费使用服务等;  4、通过 项目实战让学员达到1-3年工作经验水平。达到.NET软件工程师,.Net/C#研发工程师、中高级工程师等岗位所需技能; 课程简介 专注15年C#/.Net开发、 科研,在多个中大型企业中负责过多个中大型项目的架构设计、开发、实施部署,积累丰富的研发及实践经验,为 Net学习者快速掌握.Net企业级开发常用技术及架构,录制本视频课程系列(分为初级篇,中级篇,高级篇三大课程), 采用实战项目从0开始一步步讲授如何搭建项目架构及分析各技术的优劣,提供系统/示例完整源码(价值高)及详细上课日志,及时为您解惑答疑,让课程价值无限; 无论您是Java、C++、Python还是其它语言的开发者 ,都可以学习本系列课程,因为这种架构设计思想和方式对任何语言来说是一样的,只是实现的技术、语言不一样而已;纯干货, 含金量高,价格实惠,物超所值 ,配套的项目架构源码等均能直接应用于实际项目开发中;        课程特色        1:课程设计循序渐进,讲解细致,通俗易懂,由浅入深, 非常适合自主学习;        2:以PPT为大纲,教学过程示例丰富,强调技术关键点,并且分析透彻; 先概念后示例再应用实践;        3:物美价廉,本着知识共享,帮助更多有需求者原则,毫无保留,此外,提供源代码/示例代码+课程资料+课程相关工具+答疑; 问答环节一对一辅导,让学员学习不再困难,为想学习提升的学员提供更多的指导,欢迎试听; 本课程示例程序解决方案 SOA架构部署图(中级篇) SOA架构特色 (中级篇) SOA架构解决方案(中级篇) 与SOA架构配合开发的Web实战项目解决方案(中级篇) 教学理念        1:把需要工作的人变成工作需要的人;        2:创设立足学员,突出项目,强化技术,提高能力的教学局面; 注意 1.开发环境VS2015、Eclipse、Sql Server 2008R2; 2.赠送配套资料:详细注释的示例项目源码、详实的讲义等; 3.由初级篇—中级篇—高级篇,建议按顺序一节节学习,一节节理解;从而快速实现架构师之梦;

    378 人正在学习 去看看 刘长青

以下几种程序员注定没有前途,不管你学C#还是C++...

1.基础不牢不知亡羊补牢,以为上了几天培训班就能嘲笑科班的...
2.经验不足不知脚踏实地,以为上了两天大学就可以目中无人的...
3.悟性不够不知重新定位,以为埋头闷声苦干就可以自然提高的...
4.眼高手低不知虚心勤力,以为自己是芙蓉姐夫的...

2015-09-11 09:53:48 oiooooio 阅读数 611
  • 基于WCF构建企业级大型分布式SOA架构(初级篇)

    学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁在用?——微软、腾讯、网易、戴尔、当当网、携程、招商银行、中国知网、申通快递、房天下、汽车之家等。微软在软件行业的龙头老大位置没有任何人能够否认,它总是站在开发技术的前沿。如今微软正高举.NET大旗继续向前,他正努力使开发变得更加轻松。 学习目标  1、让学员熟练掌握WCF的核心概念及相关编程技能,对WCF技术有一个全面的、深入的、系统的了解;  2、让学员对SOA架构设计的思想和方式具有初步的认识, 对后期我们将要学习的SOA架构有一个宏观的了解;  3、让学员通过完整的示例的学习, 能够 熟练搭建开发环境, 服务构建,服务配置,服务调试、服务单元测试, Restful服务的编写, 客户端代理的编写、各种应用程序中消费使用服务等;  4、通过 项目实战让学员达到1-3年工作经验水平。达到.NET软件工程师,.Net/C#研发工程师、中高级工程师等岗位所需技能; 课程简介 专注15年C#/.Net开发、 科研,在多个中大型企业中负责过多个中大型项目的架构设计、开发、实施部署,积累丰富的研发及实践经验,为 Net学习者快速掌握.Net企业级开发常用技术及架构,录制本视频课程系列(分为初级篇,中级篇,高级篇三大课程), 采用实战项目从0开始一步步讲授如何搭建项目架构及分析各技术的优劣,提供系统/示例完整源码(价值高)及详细上课日志,及时为您解惑答疑,让课程价值无限; 无论您是Java、C++、Python还是其它语言的开发者 ,都可以学习本系列课程,因为这种架构设计思想和方式对任何语言来说是一样的,只是实现的技术、语言不一样而已;纯干货, 含金量高,价格实惠,物超所值 ,配套的项目架构源码等均能直接应用于实际项目开发中;        课程特色        1:课程设计循序渐进,讲解细致,通俗易懂,由浅入深, 非常适合自主学习;        2:以PPT为大纲,教学过程示例丰富,强调技术关键点,并且分析透彻; 先概念后示例再应用实践;        3:物美价廉,本着知识共享,帮助更多有需求者原则,毫无保留,此外,提供源代码/示例代码+课程资料+课程相关工具+答疑; 问答环节一对一辅导,让学员学习不再困难,为想学习提升的学员提供更多的指导,欢迎试听; 本课程示例程序解决方案 SOA架构部署图(中级篇) SOA架构特色 (中级篇) SOA架构解决方案(中级篇) 与SOA架构配合开发的Web实战项目解决方案(中级篇) 教学理念        1:把需要工作的人变成工作需要的人;        2:创设立足学员,突出项目,强化技术,提高能力的教学局面; 注意 1.开发环境VS2015、Eclipse、Sql Server 2008R2; 2.赠送配套资料:详细注释的示例项目源码、详实的讲义等; 3.由初级篇—中级篇—高级篇,建议按顺序一节节学习,一节节理解;从而快速实现架构师之梦;

    378 人正在学习 去看看 刘长青

这几天又开始了用 c#写窗口程序,自认为用c#做窗口程序太简单了,比那什么mfc简单太多,当然可能QT等库也是比较简单,我就懒得去学习了。


        //[return: MarshalAs(UnmanagedType.LPStr)]
        //[MarshalAs(UnmanagedType.LPStr)]


废话短说,我做一个服务器测试程序,也只有跟用户交互的部分是使用的c#窗口,其他都是c++ dll。

然后肯定会出现c#调用c++的问题,这个很容易解决,c#代码的写法如下:

        [DllImport("TestCommand.dll", EntryPoint = "StartRun", CallingConvention=CallingConvention.StdCall)]
        public static extern int StartRun(string ip, UInt16 port, StringBuilder out_err_msg, int msg_buffer_length); 

        [DllImport("TestCommand.dll", EntryPoint = "Register", CallingConvention=CallingConvention.StdCall)]
        public static extern int Register(string name_or_tel, string pwd, int reg_type, StringBuilder out_err_msg, int msg_buffer_length); 

那么c# 如何调用:

        private void RunNetIO(string ip, UInt16 port)
        {
            ThreadSynUIFunc ui_func = new ThreadSynUIFunc(ThreadSynUIFuncImpl);
            this.Invoke(ui_func, new object[] { eUIControl._register, false });

            StringBuilder out_err_msg = new StringBuilder(512);
            int ret_val = ImCommand.StartRun(ip, port, out_err_msg, 512);
            if(ret_val != Common.RET_INT_OK)
            {
                MessageBox.Show(out_err_msg.ToString());
            }

            this.Invoke(ui_func, new object[] { eUIControl._register, true });
        }

        private void ThreadSynUIFuncImpl(eUIControl ui, bool enabled)
        {
            switch(ui)
            {
                case eUIControl._register:
                    bt_connect.Enabled = enabled;
                    break;
            }
        }

        private void button_register_Click(object sender, EventArgs e)
        {
            int reg_type = Convert.ToInt32(rb_name.Tag);
            if (rb_tel.Checked) { reg_type = Convert.ToInt32(rb_tel.Tag); }
            StringBuilder out_err_msg = new StringBuilder(512);
            int ret_val = ImCommand.Register(tb_name_tel.Text, tb_pwd.Text, reg_type, out_err_msg, 512);
            if (ret_val != Common.RET_INT_OK)
            {
                MessageBox.Show(out_err_msg.ToString());
            }
        }
    }



cpp的写法:

int AssignReturnVal(char* d, int d_len, const char* s, int return_val)
{
	int s_len = strlen(s);
	if (s_len > d_len)
	{
		s_len = d_len;
	}
	strncpy_s(d, d_len, s, s_len);
	return return_val;
};

template<class Func, class... Args>
int ExecImpl(Func func, char* out_err_msg, int in_msg_buffer_length, Args... args)
{
	try{ func(args...); }
	catch (const char* ex){ return AssignReturnVal(out_err_msg, in_msg_buffer_length, ex, RET_INT_FAIL); }	
	catch (std::exception ex){ return AssignReturnVal(out_err_msg, in_msg_buffer_length, ex.what(), RET_INT_FAIL); }
	return AssignReturnVal(out_err_msg, in_msg_buffer_length, RET_STR_OK, RET_INT_OK);
}


extern "C"
{
	TESTCOMMAND_API int __stdcall StartRun(const char* ip, 
		uint16_t port, char* out_err_msg, int in_msg_buffer_length)
	{
		if (!ip || strlen(ip) == 0 || port <= 1000)
		{
			AssignReturnVal(out_err_msg, in_msg_buffer_length, "ip or port invalid.", RET_INT_FAIL);
		}
		return ExecImpl(std::bind(&BoostNet::Run, &BOOSTNET, ip, port), out_err_msg, in_msg_buffer_length);
	}

	TESTCOMMAND_API int __stdcall Register(const char* name_or_tel,
		const char* pwd, int reg_type, char* out_err_msg, int in_msg_buffer_length)
	{
		return ExecImpl(NetCommand::Register, out_err_msg, in_msg_buffer_length, name_or_tel, pwd, reg_type);
	}

}



就这样没什么难度,那么如果c++要调用c#函数呢,比如来消息了,c++网络层总要通知c#窗口吧。

比如c++想要传递给c#:

typedef void (__stdcall *FUNC_ARGC_3)(uint64_t msg_id, const char* title, const char* des);
FUNC_ARGC_3 _g_func_3 = nullptr;
那么,c++该怎么写,c# 该怎么写?

ok,下面展示2个例子,不但是供我以后参考,也希望帮助些朋友。

第一部分:

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

cpp文件:

typedef void (__stdcall *FUNC_ARGC_3)(uint64_t msg_id, const char* title, const char* des);
FUNC_ARGC_3 _g_func_3 = nullptr;

extern "C"
{
	TESTCOMMAND_API void __stdcall SetCallBackFunc(void* func, int argc)
	{
		switch (argc)
		{
		case 3:
			_g_func_3 = (FUNC_ARGC_3)func;
			return;
		}
	}
}

h文件:
extern "C"
{
	//typedef void(*FUNC_ARGC_3)(uint64_t msg_id, const char* title, const char* des);
	TESTCOMMAND_API void __stdcall SetCallBackFunc(void* func, int argc);
}

关键部分,c#:

        //typedef void(*FUNC_SENDFAIL_CALLBACK)(int);
        public delegate void FUNC_SET_CALLBACK_SENDFAIL(int proto_id);
        [DllImport("TestCommand.dll", EntryPoint = "SetSendFailedCallbackFunc", CallingConvention = CallingConvention.StdCall)]
        public static extern void SetSendFailedCallbackFunc(FUNC_SET_CALLBACK_SENDFAIL func);

        //typedef void(*FUNC_ARGC_3)(uint64_t msg_id, const char* title, const char* des);
        public delegate void FUNC_SET_CALLBACK_3(UInt64 msg_id, string title, string des);
        [DllImport("TestCommand.dll", EntryPoint = "SetCallBackFunc", CallingConvention = CallingConvention.StdCall)]
        public static extern void SetCallBackFunc_3(FUNC_SET_CALLBACK_3 func, int argc);

        public Form1()
        {
            InitializeComponent();

            ImCommand.SetSendFailedCallbackFunc(new ImCommand.FUNC_SET_CALLBACK_SENDFAIL(Callback_sendfail));
            ImCommand.SetCallBackFunc_3(new ImCommand.FUNC_SET_CALLBACK_3(Callback_argc_3), 3);
        }

        private void Callback_sendfail(int proto_id)
        {
            MessageBox.Show(string.Format("send msg[{0}] fail.", proto_id));
        }

        private void Callback_argc_3(UInt64 msg_id, string title, string des)
        {
            MessageBox.Show(string.Format("[{0}:{1}]", msg_id, des), title);
        }

注意:或许你可能发现,c#多了一部分代码,多的那一部分对应的c++代码将在下面展示,下面第二部分就不在展示c#代码了!!! 请各就各位。


第二部分的c++代码:

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

h:

extern "C"
{
	//typedef void(*FUNC_SENDFAIL_CALLBACK)(int);
	TESTCOMMAND_API void __stdcall SetSendFailedCallbackFunc(void* func);
}

cpp:

typedef void(__stdcall *FUNC_SENDFAIL_CALLBACK)(int);
FUNC_SENDFAIL_CALLBACK _g_func_send_fail_callback = nullptr;

extern "C"
{
	TESTCOMMAND_API void __stdcall SetSendFailedCallbackFunc(void* func)
	{
		_g_func_send_fail_callback = (FUNC_SENDFAIL_CALLBACK)func;
	}
}


ok,希望 我的废话不多,能给朋友一些直接参考!

2018-07-05 19:01:45 GarfieldGCat 阅读数 126
  • 基于WCF构建企业级大型分布式SOA架构(初级篇)

    学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁在用?——微软、腾讯、网易、戴尔、当当网、携程、招商银行、中国知网、申通快递、房天下、汽车之家等。微软在软件行业的龙头老大位置没有任何人能够否认,它总是站在开发技术的前沿。如今微软正高举.NET大旗继续向前,他正努力使开发变得更加轻松。 学习目标  1、让学员熟练掌握WCF的核心概念及相关编程技能,对WCF技术有一个全面的、深入的、系统的了解;  2、让学员对SOA架构设计的思想和方式具有初步的认识, 对后期我们将要学习的SOA架构有一个宏观的了解;  3、让学员通过完整的示例的学习, 能够 熟练搭建开发环境, 服务构建,服务配置,服务调试、服务单元测试, Restful服务的编写, 客户端代理的编写、各种应用程序中消费使用服务等;  4、通过 项目实战让学员达到1-3年工作经验水平。达到.NET软件工程师,.Net/C#研发工程师、中高级工程师等岗位所需技能; 课程简介 专注15年C#/.Net开发、 科研,在多个中大型企业中负责过多个中大型项目的架构设计、开发、实施部署,积累丰富的研发及实践经验,为 Net学习者快速掌握.Net企业级开发常用技术及架构,录制本视频课程系列(分为初级篇,中级篇,高级篇三大课程), 采用实战项目从0开始一步步讲授如何搭建项目架构及分析各技术的优劣,提供系统/示例完整源码(价值高)及详细上课日志,及时为您解惑答疑,让课程价值无限; 无论您是Java、C++、Python还是其它语言的开发者 ,都可以学习本系列课程,因为这种架构设计思想和方式对任何语言来说是一样的,只是实现的技术、语言不一样而已;纯干货, 含金量高,价格实惠,物超所值 ,配套的项目架构源码等均能直接应用于实际项目开发中;        课程特色        1:课程设计循序渐进,讲解细致,通俗易懂,由浅入深, 非常适合自主学习;        2:以PPT为大纲,教学过程示例丰富,强调技术关键点,并且分析透彻; 先概念后示例再应用实践;        3:物美价廉,本着知识共享,帮助更多有需求者原则,毫无保留,此外,提供源代码/示例代码+课程资料+课程相关工具+答疑; 问答环节一对一辅导,让学员学习不再困难,为想学习提升的学员提供更多的指导,欢迎试听; 本课程示例程序解决方案 SOA架构部署图(中级篇) SOA架构特色 (中级篇) SOA架构解决方案(中级篇) 与SOA架构配合开发的Web实战项目解决方案(中级篇) 教学理念        1:把需要工作的人变成工作需要的人;        2:创设立足学员,突出项目,强化技术,提高能力的教学局面; 注意 1.开发环境VS2015、Eclipse、Sql Server 2008R2; 2.赠送配套资料:详细注释的示例项目源码、详实的讲义等; 3.由初级篇—中级篇—高级篇,建议按顺序一节节学习,一节节理解;从而快速实现架构师之梦;

    378 人正在学习 去看看 刘长青
与C++不同的点:
  • 任何常用变量类型的变量必须初始化否则无法通过编译(类和结构如果没有显示初始化则默认初始化为0)
  • 所有代码都必须位于类中
  • 位于函数体(方法)内的变量作用域是整个函数体的,不像C类语言每对花括号内的作用域独立可覆盖。但是,C#函数体(方法)内的变量可以覆盖类的成员变量。
  • C#所有类的"变量"都是引用,而非实体,所以初始化都需要new方式,只有结构体类型才是实体。
  • bool类型无法通过数值转换,只能是true或false,而不能使用0或非0。
  • char类型是16位长,可保存Unicode字符
  • 所有类型(包括基础类型)都继承自同一个根类型object,以此来提供C++中多态的支持。
  • 对字符串的转义字符提供了新方式,可以在字符串前加'@',这样字符串中所有内容将不会转义,如@"C:\Windows\System32"等于"C:\\Windows\\System32"。甚至可以直接换行。
  • 字符串支持插值方式而不用编写参数列表,如$"string is {str}"。花括号内容被看做是变量。
  • foreach无法改变集合中的值,即无法用作迭代
  • 枚举类型enum都会被派生自共有基类,以此提供了字符串与枚举值之间的转换及列举所有枚举量等等特性。
  • C#的变量名可以使用Unicode字符,用\uXXXX可以指定。
  • 类和结构都需要使用new来实例化,且都会被其初始化,默认为0。

C#与C++的区别

阅读数 819

没有更多推荐了,返回首页