RSS 2.0 Feed
C++/CLI/Managed C++ Extension
摘要:使用过DLL的人都知道,重用二进制的代码很容易造成DLL地狱,这也是为什么Windows引入系统文件保护的原因之一。在Visual C++2005中引入的程序集清单(Assembly Manifest)看起来似乎可以解决这个问题,但是很多人发现在把Visual Studio更新到SP1后创建的安装程序项目不再能创建可以正常运行的安装程序。他们得到的是一个错误消息:应用程序配置错误,请重新安装应用程序。 看起来这个问题的原因是Windows Vista SDK和Visual Studio 2005 SP1的安装都把Visual C++2005运行时刻库(CRT)的合并模块安装到C:\Program Files\Common Files\Merge Modules下。Windows Vista平台SDK中的是CRT 8.0.50727.42,而Visual Studio 2005 SP1包含的是CRT 8.0.50727.752。如果安装完Visual Studio 2005 SP1之后再安装/修复Windows Vista SDK,那么C:\Program Files\Common Files\Merge Modules下会是Windows Vista SDK的旧版本,这会使得安装程序项目编译出有问题的部署包,因为应用程序使用的是新版本的CRT。 解决这个问题的方法是在安装/修复Windows Vista SDK之后重新安装Visual Studio 2005 SP1——你可能需要6.2G的系统盘剩余空间来完成这个安装。另外,为了保险起见,安装之后应该备份C:\Program Files\Common Files\Merge Modules下面的文件,至少也要把它们设为只读文件。...[阅读全文]

posted @ | Feedback (4) | Filed Under [ 集成开发环境(IDE) 平台SDK(Platform SDK) C++/CLI/Managed C++ Extension ]

摘要:月中MSDN第九频道对Visual C++项目组的两位产品经理进行了采访。摘要如下 很多面向中小企业的应用已经转向托管开发。但是C++的历史悠久,有太多代码积累仍旧是非托管的C++,而转向托管代码的话,C++程序员喜欢用工具支持更多的C#,所以Visual C++的焦点从托管支持转向非托管支持和托管/非托管互操作。 目前的目标包括对STL/CLR的支持和编译器级别的安全性(安全STL是类库级别的),以及辅助MFC基本类和托管代码互操作的模版。 LINQ这样的新技术不会在Orcas中支持,不过如果LINQ成为新的C++0x标准之一的话,当然也会被Visual C++支持。对C++标准的兼容性会加强以适应跨操作系统平台的应用程序。 一些80年代编译器的特性,例如编译期间节省内存、磁盘空间和CPU资源的做法在20年后已经不合时宜,编译器会升级以适应硬件的变化。比如对多核CPU的支持。 尽管Windows Vista开始推出了一些WPF这样的托管API,但是也增加了8000个外壳搜索扩展这样的非托管API。Visual C++的目标是让所有的Windows API在Visual C++中可用,甚至会有MFC或者ATL封装类。 希望我的听力没出大问题。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 集成开发环境(IDE) C++/CLI/Managed C++ Extension ]

摘要:在计算亲和数的时候,由于涉及到密集运算,有必要把计算工作转移到背景线程,以避免界面会失去响应。在.Net 1.0中,可以用ManualResetEvent、线程和Delegate的异步调用来实现,但是在.Net 2.0中,可以使用BackgroundWorker对象来简化这个工作。这个对象自动化了进度报告和终止线程的功能。 要使用这个对象来创建工作线程,首先需要加入一个BackgroundWorker对象到表单(Form)或者用户控件(UserControl),然后调用其RunWorkerAsync方法: private: System::Void AmicableNumberView_Load(System::Object^ sender, System::EventArgs^ e) ...{ propertyGrid->SelectedObject = Range; listViewPairs->VirtualListSize=0; timer->Start(); m_rAmicableNumberPairs->Clear(); backgroundWorker->RunWorkerAsync (Range); } 在线程创建之后会自动触发DoWork事件。这个事件中的处理类似于1.1中的线程函数体,可以通过访问DoWorkEventArgs参数的argument属性来访问在用RunWorkerAsync启动线程时传递的参数,以及调用ReportProgress定时报告进度。private: System::Void backgroundWorker_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) ...{ CAmicableNumberRange range=(CAmicableNumberRange)e->Argument; int nNumbers=range.Max-range.Min; int nPercentComplete=0; m_rGenerator->Range=range; m_rGenerator->StartWork(); while(!backgroundWorker->CancellationPending && m_rGenerator->DoWork())...{ nPercentComplete = (int)( ......[阅读全文]

posted @ | Feedback (6) | Filed Under [ 用户界面 .Net Framework 类库(Library) 语言(Language) C++/CLI/Managed C++ Extension ]

摘要: 点此查看本文代码  相亲数(Amicable Pair),又称亲和数、友爱数,指两个正整数中,彼此的全部约数之和(本身除外)与另一方相等。 例如220与284: 220的全部约数(除掉本身)相加是:1+2+4+5+10+11+20+22+44+55+110=284 284的全部约数(除掉284本身)相加的和是:1+2+4+71+142=220 寻找指定范围内的相亲数的一个方法如下:对于范围内的每个数,用试除法获得约数,之后求和: int GetAmicableNumber(int nNumber) ...{ int nSumDivisors = SumDivisors(nNumber); if (nSumDivisors == nNumber) return 0;//perfect number if (nNumber == SumDivisors(nSumDivisors)) return nSumDivisors; return 0; } int SumDivisors(int n) ...{ ......[阅读全文]

posted @ | Feedback (9) | Filed Under [ .Net Framework 语言(Language) C++/CLI/Managed C++ Extension ]

摘要:一个算法的优化的相关代码// Amicable.h #pragma once #include "WinFormThread.h" using namespace System; using namespace System::Collections::Generic; /**//// <summary> /// Amicable Number Generator /// Search a range for amicable pairs. /// </summary> namespace Amicable ...{ /**//// <summary> /// An amicable pair consists of two distinct integers /// for which the sum of proper divisors (the divisors excluding the number itself) ///......[阅读全文]

posted @ | Feedback (1) | Filed Under [ .Net Framework 语言(Language) C++/CLI/Managed C++ Extension ]

摘要:尽管4月份还没到,一篇MSDN杂志4月号的文章已经出来了(http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy)。这篇文章描述了如何使用ManagedSpyLib库来访问其他进程内的托管控件及其属性和事件。尽管这个程序的主要目的是监视,但是也可以用ManagedSpyLib库来控制其他进程内的托管控件。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ .Net Framework 集成开发环境(IDE) 类库(Library) C++/CLI/Managed C++ Extension ]

摘要: 在VC.Net中使用默认设置/clr编译时,一个托管函数会产生两个入口点,一个是托管的,供托管代码调用,另外一个是非托管的,供非托管代码调用。但是函数地址,特别是虚函数指针只能有一个值,所以需要有一个默认的入口。非托管入口点可能是所有调用的默认入口(在 Visual Studio .NET2003 中,编译器总是会选择非托管入口,但是在Visual Studio 2005中,如果参数或者返回值中包含托管类型,那么编译器会选择托管入口),而另外一个只是使用托管C++中的互操作功能对默认入口的调用。在一个托管函数被另一个托管函数调用的时候,这可能会造成不必要的托管/非托管上下文切换和参数/返回值的复制。如果函数不会被非托管代码使用指针调用,那么可以在声明函数时用VC2005新增的__clrcall修饰符阻止编译器生成两个入口。现在用简单的冒泡排序算法来比较一下使用__clrcall之后的性能改善程度。 using namespace System; #define ARRAY_SIZE 1000 struct bubbleBase ...{ int value; }; class bubble1:public bubbleBase ...{ public: virtual int getvalue()...{return value;} virtual void setvalue(int newvalue)...{value=newvalue;} }; class bubble2:public bubbleBase ...{ public: virtual int __clrcall getvalue()...{return value;} virtual void __clrcall setvalue(int newvalue)...{value=newvalue;} }; template<class T> void bubbleSort(int length) ...{ TimeSpan ts; T* array1=new T[ARRAY_SIZE]; for (int i=0;i<ARRAY_SIZE ;i++) ...{ array1[i].setvalue(ARRAY_SIZE-i-1); } ......[阅读全文]

posted @ | Feedback (1) | Filed Under [ 随笔 .Net Framework 编译(CodeGen) 类库(Library) 语言(Language) C++/CLI/Managed C++ Extension ]

摘要:C#程序员可以用三个斜杠来开始XML格式的注释,而且编译器可以据此生成可用于自动生成帮助文档的XML文件。Visual C++ 2005中的编译器也支持了这个功能,而且对非托管函数也生效,前提是必须打开/clr和/DOC开关,并且不能使用/clr:oldSyntax开关编译。/**//// ///Use two bubble sort steps ///to show the performance information ///of different function calls. /// int main(array<System::String ^> ^args) ...{ bubbleSort<bubble1>(ARRAY_SIZE); bubbleSort<bubble2>(ARRAY_SIZE); return 0; } #pragma unmanaged /**//// ///testing unmanaged function... /// int foo() ...{ return 0; } 有空的话,多去微软的反馈中心提提对产品的建议是很有好处的…… 参考 /doc (Process Documentation Comments) (C/C++)( http://msdn2.microsoft.com/en-us/library/ms173501.aspx ) XML Comments for Managed C++ Applications (http://www.codeproject.com/dotnet/MCXDoc.asp) NDoc Code Documentation Generator for .NET(http://ndoc.sourceforge.net)...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 编译(CodeGen) 集成开发环境(IDE) 语言(Language) C++/CLI/Managed C++ Extension ]

摘要:目前版本的VC2005测试版中,default关键字不仅用于指定类级别的索引器,而且也用于访问默认属性。但是奇怪的是,默认属性的原名不能访问了,也就是说,如果要把下面的代码段从托管C++移植到VC2005附带的C++/CLI,不仅需要更改指针的类型,而且要把属性的名称更改为default: //[System::Reflection::DefaultMemberAttribute("Fields")] interface _Recordset//托管C++语法//extern _Recordset* results;Fields* ResultFields=results->Fields;//C++/CLI语法//extern _Recordset^ results;Fields^ ResultFields=results->default; 如果继续使用原来名字来访问属性的话,会报告编译错误: Fields^ ResultFields=results->Fields;//C3293: 'Fields': use 'default' to access the default property (indexer)。 这是一个Breaking Change。在语言规范中,默认索引属性只使用一个名字“default”,而且只有这一个实现。更进一步,默认索引属性只能用如下方式访问: obj[index] obj->default[index] obj->default::get(index) obj->default::set(index, value) 顺便说一下,在C++/CLI中也可以使用类似C#里面的for each语句了( http://msdn2.microsoft.com/library/ms177202(en-us,vs.80).aspx),而且对于非托管的STL容器也有效,不过看起来真不习惯。 参考 New C++ Language Features (http://msdn2.microsoft.com/library/xey702bw(en-us,vs.80).aspx) Breaking Changes in the Visual C++ 2005 Compiler(http://msdn2.microsoft.com/library/ms177253(en-us,vs.80).aspx)...[阅读全文]

posted @ | Feedback (0) | Filed Under [ .Net Framework 编译(CodeGen) C++/CLI/Managed C++ Extension ]

摘要:使用WinDbg调试VC程序 虽然在VC6.0中可以通过安装Visual C++ Toolkit(网站:http://msdn.microsoft.com/visualc/vctoolkit2003/)来编写基于最新版本的平台SDK、DirectX SDK的程序以及托管代码,但是VC6附带的调试器并不支持新版本的调试信息,所以实际上是不能用VC6来调试新版本编译器生成的程序的。一个替代的解决方案是使用新版本的Windows调试工具Windbg(网站:http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx)。Windbg的调试功能基本和Visual C++中的相同,但是需要手动设定源文件和调试符号文件的搜索路径(可以参考VC6.0中的对应设置)。一些代码,例如MFC的代码比较难于定位,这时可以双击调用堆栈中的函数名称来打开文件并定位到函数所在位置。Windbg可以进行有限的托管代码调试,但是调试过程比较麻烦。在没有安装Visual Studio的计算机上调试,例如进行远程调试的时候可能还需要部署调试符号(Generating and Deploying Debug Symbols With Visual C++ 6.0)。 调试Visual Studio .Net 的程序需要用户是管理员或者"Debug User"用户组成员。如果登录用户不是该组成员,那么也可以用WinDbg来调试程序。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ 随笔 .Net Framework 安全和管理(Security and Management) 调试技巧(Debugging) 工具(Tools) 集成开发环境(IDE) 类库(Library) 平台SDK(Platform SDK) 文档(Documentation) 语言(Language) C++/CLI/Managed C++ Extension ]

Full C++/CLI/Managed C++ Extension Archive