切尔斯基的工作

为者长成,行者长至

C++/CLI:被忽视的集成技术

 十几行代码,就使一个重要的旧系统组件,完全融入了基于.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);
}
}

]

阅读更多
上一篇Web Services:WSDL 1.1 规范中的几个错误
下一篇AJP/JK:异构Web平台的集成技术
想对作者说点什么? 我来说一句

VC++ 2005(8):与ISO-C++集成

2007年11月09日 3.73MB 下载

VC++ 2005(8)_2:与ISO-C++集成

2007年11月09日 5MB 下载

C++/CLI教程

2018年03月18日 1.15MB 下载

超越C++——C++/CLI

2010年05月11日 272KB 下载

C++\CLI学习\pdf

2010年11月08日 471KB 下载

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

关闭
关闭