c#
congcongjoy
这个作者很懒,什么都没留下…
展开
-
c#virtual,abstract,new,override
在c#中使用virtual关键字告诉子类该方法可以被覆盖,在子类中使用override进行重写。 在子类中不使用override关键字重写基类同名方法,编译器默认添加new关键字。 new关键字可以在子类中隐藏基类方法,而virtual关键字在整个继承链中覆盖掉基类方法。 使用virtual关键字的方法必须有实现,而abstract方法不能有实现且在子类中没有使用abstract就必须实现该方原创 2015-04-24 11:13:48 · 428 阅读 · 0 评论 -
c#抽象类和接口
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。原创 2015-04-24 13:56:47 · 529 阅读 · 0 评论 -
关于P/Invoke(1)
之前封装c++dll时总是出现”对 P/Invoke 函数的调用导致堆栈不对称。原因可能是托管的 P/Invoke 签名与非托管的目标签名不匹配”的问题,后来发现原来c/c++使用的是cdecl方式调用,而c#默认使用的是stdcall的方式来调用非托管代码,所以我们在调用native c++ dll的时候需要加上CallingConvention=CallingConvention.Cdecl来指原创 2015-05-25 10:43:17 · 549 阅读 · 0 评论 -
关于P/Invoke(2)
可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数 当尝试导出 C++ 修饰函数名时,这种便利最明显。 由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。 如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。 若要导出函数,__declsp原创 2015-05-25 10:58:12 · 477 阅读 · 0 评论 -
VS2013下在C#中调试C++ dll
dll项目,属性-配置属性-调试-把 命令 为 调用该dll的exe工程的bin\Debug*.exe dll项目,属性-配置属性-调试-把 调试器类型 设置为 仅限本机 dll项目,属性-配置属性-常规-把输出目录设置为 调用该dll的exe工程的bin\Debug目录下 在dll项目中打好断点,然后重新生成dll,输出dll到设置的目录下exe项目,属性-调试-启用本机代码调试 exe项原创 2015-05-25 14:26:28 · 2239 阅读 · 2 评论 -
关于P/Invoke(3)
在调用dll时,我们可能会遇到需要调用像printf之类的可变参数的方法,我们可以使用__arglist关键字来传入可变参数:[DllImport("msvcrt.dll", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)] extern static int printf(string format, __arglis原创 2015-05-25 11:32:38 · 373 阅读 · 0 评论