2013年3月21日 星期四

NET 錯誤回應


P1: Application Name                   (應用程式名稱)
P2: Application version                 (應用程式版本)
P3: Application time stamp           (應用程式時間標記)
P4: Assembly/Module name         (組件/模組名稱)
P5: Assembly/Module version      (組件/模組版本)
P6: Assembly/Module timestamp (組件/模組時間標記)
P7: MethodDef                             (通常為錯誤的函式的位置)
P8: IL offset                                  (..... 不知道 ........)
P9: Exception name                     (錯誤的類型)

 

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

2013年3月18日 星期一

C , C++ , C# 型態對照表


Conclusion在C#與C/C++作interop時,最重要的就是兩個語言型別的對應,整理如下:

Unmanage type in Wtypes.hUnmanaged C typeManaged class nameManaged C# typeDescription
HANDLEvoid *System.InPtrN/A32 bits on 32-bit windows operation systems, 64 bits on 64-bit windows operation systems.
BYTEunsigned charSystem.Bytebyte8 bits
SHORTshortSystem.Int16short16 bits
WORDunsigned shortSystem.UInt16ushort16 bits
INTintSystem.Int32int32 bits
UINTunsigned intSystem.UInt32uint32 bits
LONGlongSystem.Int32int32 bits
BOOLlongSystem.Int32int32 bits
DWORDunsigned longSystem.Int32int32 bits
ULONGunsigned longSystem.Int32int32 bits
CHARcharSystem.CharcharDecorate with ANSI
LPSTRchar *System.String or System.Text.StringBuilderstringDecorate with ANSI
LPCSTRconst char *System.String or System.Text.StringBuilderstringDecorate with ANSI
LPWSTRwchar_t*System.String or System.Text.StringBuilderstringDecorate with ANSI
LPCWSTRconst wchar_t*System.String or System.Text.StringBuilderstringDecorate with ANSI
FLOATFloatSystem.Singlefloat32 bits
DUOBLEDoubleSystem.Doubledouble64 bits