为了让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冲突,从而引起不确定性。
#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的后面。
#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
沒有留言:
張貼留言