十几行代码,就使一个重要的旧系统组件,完全融入了基于.Net的新系统中!事情是这样的:
-
C语言写的一个标准的 Win32 DLL,完成了一个算法相当复杂的功能,在旧有系统中稳定而高效的运行,但是已没有源代码
-
我们的新系统需要完全相同的功能组件,但新系统基于.Net,用C#开发
幸好有C++/CLI,只用了两个小时开发调试,十几行代码就搞定!主要工作就是重新用C++/CLI的语法声明 DLL 中的函数,或曰所谓托管非托管混合编程,例如:
原来的 DLL 函数声明为:_declspec(dllimport) bool QueryInit(const char* lpszDataFilePath = NULL);
用C++/CLI重新声明如下:
[DllImport("Query.dll", EntryPoint="QueryInit")]
extern "C" bool QueryInit([MarshalAs(UnmanagedType::LPStr)] String^ lpszDataFilePath);
然后就可以直接调用:bool ok = QueryInit("d:/data/");包装一下编译为CLI的DLL就可以给C#用
不需要 Web Service 等“重型”的包装技术,C++/CLI提供了在特定情形下最直接简便的选择;当然这种集成技术主要面向功能的集成,对面向数据,面向服务的集成而言没有必要,因为在那些情形下有多种方案可供选择
由于并非专业的 .Net 开发者,或许有更直接的方法可以在 C# 中调用标准 Win32 DLL,恳请各位看官赐教
[今天又看了一下,,发现C#也可以:
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);
}
public class HelloWorld {
public static void Main() {
Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
}
}
]