Code for Love

Write Poem, With Code

0%

今天来回顾下P/Invoke中的各种细节,加深下理解和记忆。

概念

P/Invoke,全名Platform Invocation Services,是.NET框架中的一个特性。允许托管代码(比如C#,VB等.NET语言编写的代码)调用非托管的DLL函数,包括Win32 API库和其它我们自己编写的C/C++动态链接库中的函数。

P/Invoke的名字就来自“Platform Invocation”,意思是调用平台函数,通常是调用C/C++的本地函数库。

在C#中,我们使用[DllImport]特性来导入DLL,然后声明对应的静态方法就可以使用了。例如调用windows api中的一个函数MessageBox,我们可以这样声明:

1
2
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

然后我们就可以像普通C#函数一样来使用MessageBox了:

1
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
阅读全文 »

今日,让我们来探讨一下C#中协变、逆变、不变的编译器处理和内部逻辑上的差别,并对重点作出总结。力求能够深刻的理解协变、逆变的本质,并在实际工作中加以利用。

引入

先看一个C#语句:

1
Person p = new Student()

这个语句中,Student类是Person类的派生类,而这个赋值写法是遵循里氏替换原则的。之所以高级编程语言都支持这样的替换原则,本质上是因为这样一个基础逻辑:

1
公理:一个派生类拥有其基类的所有资源(属性或方法等),因此任何需要使用基类(实际上就是使用这些资源)的地方,让其使用拥有同样甚至更多资源的派生类,是必然可行的。
阅读全文 »

opc da局域网远程连接的配置进行过许多次,由于DCOM配置本身相对偏僻,前后使用的Windows开发与调试环境也不尽相同,所以每次都是参照教程摸索着走,以至于成不成功全看天意,且很多教程是需要关防火墙的,多少会影响到服务端的安全策略。最近刚好项目需要,遂于午后与吾友@bool使用两台机器一一尝试总结,得出一套精简方案,帮助广大工控人以尽量少的设置来完成opc da局域网通讯。

阅读全文 »