2013年3月21日 星期四

error C2872:"IServiceProvider":模稜兩可的符號

網路上資料:

为了让C#使用一个非托管Dll中的类,于是想用托管c++包装成托管的dll,但是在编译时出现了以下错误:


error C2872: “IServiceProvider”: 不明确的符号     c:\program files\microsoft sdks\windows\v6.0a\include\servprov.h     96     CSRLib
.............................................................................
经过一番查找,知道了原因,解决方法如下:

是因为using namespace System;和windows.h中的名称冲突,

“windows.h”间接引入了 servprov.h,   而 servprov.h中有这样的定义:typedef interface IServiceProvider IServiceProvider; 
其中 IServiceProvider与System命名空间中的 IServiceProvider冲突,从而引起不确定性。


C# code





#include "CSRLib.h"//位置不对  
#include "LaneSpeech.h"  
#include <vcclr.h>  
#using "Speech_Re.dll" 



其中CSRLib.h中包含using namespace System;
而LaneSpeech.h中间接引入了windows.h头文件,因而使using namespace System;出现在windows.前面。

解决方法是令using namespace System;现出在windows.h的后面。

C# code






#include "stdafx.h"  
#include "LaneSpeech.h"  
#include <vcclr.h>  
#using "Speech_Re.dll"  
#include "CSRLib.h"  


但这样并不能完全解决问题,当代码中用到IServiceProvider(或其它冲突的名称)时同样会引起同样的错误。解决的办法是,不引入System命名空间而是用完全限定名使用其中的名称,如System::IServiceProvider
详细信息请参考以下文章:
http://msdn.microsoft.com/en-us/library/Aa712965
http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.languages.vc/2007-01/msg00087.html

沒有留言:

張貼留言