最近帮朋友写个小东西的时候,刚好用到了C#和C++的混合编程,记录一些tips供日后参考。
首先说明下环境:C#调用C++的库函数,C++建立一个非托管类库项目,C#项目引用之。
1.C++类库中的tips
C++类库中导出函数的声明如下:
extern "C" __declspec(dllexport) int* Detect(char* data,int width,int height);
需要注意的是:
要使用extern "C" 标明,否则C#调用时会找不到方法名;其次要使用__declspec(dllexport)标明为导出函数。
2.C#调用的tips
C#调用时,首先需要声明外部方法的签名,如下:
[DllImport("DetectDll.dll", CallingConvention = CallingConvention.Winapi)]
public extern static void Detect ([MarshalAsUnmanagedType.LPArray,SizeConst=8]byte[] bp,int w,int h,[MarshalAsUnmanagedType.LPArray,SizeConst=4]int[] result);
需要注意的是:
指明CallingConvention为Winapi类型;
对于数组类型需要指明MarshalAs的方式,一般的定长数组或下标有上限的,都可以用LPArray来Marshal。
3.其它
调用非托管代码需要使用unsafe关键字,对于指针需要进行fixed限制。
相关文章:
- C#中dllimport用法 dllimport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。 dllimport属性应用于方法,要求最少要提供包含入口点的dll的名称。 [AttributeUsage(AttributeTargets.Method)] public class DllImportAttribute: System.Attribute { public DllImportAttribute(string dllName) {...} //定位参数为dllName public CallingConvention...
- 访问Repeater的Footertemplate中控件的方法 Footertemplate在整个Repeater的Controls集合中是最后一个,因此访问它的途径之一是这样的: rpt是一个Repeater对象 Control ctl = rpt.Controls[rpt.Controls.Count-1]; 之后如果需要访问Footertemplate中的控件,则只需调用ctl的findcontrol方法即可。 需要注意的是,采用上述方法访问Footertemplate控件,必须在repeater进行databind之后,否则会出现null引用的错误。...
- CQRS体系结构模式 本文介绍了CQRS模式的基本结构,并对其中一些重要概念作了注释,也是我在实践和思考当中总结出来的内容(PS:转载请注明出处)。学习过DDD 而刚刚开始CQRS的朋友,在阅读一些资料的时候势必会感到疑惑,希望本文能够帮助到这些朋友。比如最开始阅读的时候,我也不知道为什么一定要通过领域事件去更改对象状态,而不是在对象状态变更的时候,去触发领域事件,因为当时我仍然希望能够在Domain Model中方便地使用getter/setter,我当时也希望能够让Domain Model同时适应于经典DDD和CQRS架构。在经过多次尝试后发现,这种做法是不合理、不可取的,也正如Udi Dahan所说:CQRS是一种模式,既然是模式,就是用来解决特定问题的。 继续阅读 »...
- C#中“回发或回调参数无效”的解决办法 asp.net中使用回发按钮时经常会遇到这样的错误: 回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用<%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 这是我们经常会犯的一个小错误,它的原因在于Page_Load方法中没有对页面是初次载入还是PostBack进行判断,导致回调事件触发前对控件进行了更改,此时,只要加入对是否PostBack的判断既可。如下例: protected...
- 几个计算机专业工具页面 Java和C#的完整比较。这是一个相当完整的比较Java和C#语言的网页。很有意思,有助于你了解Java和C#的各种特性和不同。 SQL 性能调优。这个文档覆盖了IBM DB2, MySQL, Oracle,PostgreSQL 和 Microsoft SQL Server。不过这个电子书还没有写完,你可以使用其RSS, twitter 或 Facebook 来跟踪其进度。 Clever Algorithms。这个电子书也是免费的。其主要面向一些AI和面向自然的算法,一共45个。其包括概率随机算法,迭代进化算法,物理算法,可能性算法,蚂蚁蜜蜂式算法,免疫算法,神经算法等。里面大量的高等数学公式对我来说我已经看不懂了。不过,我相信这个电子书非常适合搞理论研究的人,或是需要抄袭一篇论文以顺利毕业的人使用。继续阅读 »...
其实是不是还可以用C++调用C#的呢?
可以的
呵呵,忙着写实验室的项目,实在是顾不上更新啊
最近大树有点懒
呵呵,网页方面的脚本语言还是不难的,你应该是打算学这个吧?php?
编程教程,俺看不懂,我要恶补编程,但可以老鼠偷鸡蛋