2011-07-22 26 views
1

我遇到了問題,我的.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

回答

1

Mscoree.dll不是oracle。使用SysInternals的ProcMon實用程序查找機器註冊表的烘烤位置。最好將跟蹤與可以快速縮小範圍的機器進行比較。