我遇到了問題,我的.Net構建系統在錯誤的文件夾中查找其框架引用。該機器安裝了.NET 4.0和Visual Studio 2010,並且這個問題發生在.Net版本小於4.0的項目上(我的例子是在.Net 3.5中)。該問題看起來像構建問題,但深入挖掘它,我發現Microsoft.Build.Tasks.v4.0.dll(在構建過程中調用)調用mscoree.dll並獲取錯誤信息:mscoree.dll的GetRequestedRuntimeInfo()導致不正確的TargetFrameworkDirectories - 如何調試?
(反編譯源) FrameworkLocationHelper。 ConstructDotNetFrameworkPathFromRuntimeInfo(字符串requestedVersion):
int num1 = 264;
int num2 = 25;
StringBuilder pDirectory;
StringBuilder pVersion;
uint requestedRuntimeInfo;
do
{
pDirectory = new StringBuilder(num1);
pVersion = new StringBuilder(num2);
uint dwDirectoryLength;
uint dwlength;
--------> requestedRuntimeInfo = NativeMethodsShared.GetRequestedRuntimeInfo(string.Empty, requestedVersion, string.Empty, 16U, 64U, pDirectory, num1, out dwDirectoryLength, pVersion, num2, out dwlength);
num1 *= 2;
num2 *= 2;
}
while ((int)requestedRuntimeInfo == -2147024774);
if ((int)requestedRuntimeInfo == 0)
return Path.Combine(((object)pDirectory).ToString(), ((object)pVersion).ToString());
的問題是調用NativeMethodsShared.GetRequestedRuntimeInfo(...),這在其它機器上返回被請求的.NET版本(3.5,3.0和2.0)但是在有問題的機器上每次返回4.0,導致參考路徑引用.Net 4.0(這不應該發生在.Net 3.5版本中)。不幸的是,這是一個電話到mscoree.dll中,我不知道如何調試這個或找到源代碼:
[DllImport("mscoree.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern uint GetRequestedRuntimeInfo(string pExe, string pwszVersion, string pConfigurationFile, uint startupFlags, uint runtimeInfoFlags, StringBuilder pDirectory, int dwDirectory, out uint dwDirectoryLength, StringBuilder pVersion, int cchBuffer, out uint dwlength);
僅供參考,其他工作機器將有這些框架目錄:
TargetFrameworkDirectories: C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ v3.5 \, C:\ Windows \ Microsoft.NET \ Framework \ v3.5 \, C:\ Program Files(x86) \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \, C:\ Windows \ Microsoft.NET \ Framework \ v3.0 \, C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \
雖然出現問題的機器有這些框架目錄:
TargetFrameworkDirectories: C:\ Program Files文件(x86)的\參考大會\微軟\框架\ v3.5版本\, C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \, C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ v3.0 \, C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \, C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \
此外,我已卸載並重新安裝.Net 2.0,3.0,3.5,4.0和Visual Studio 2010