使用「ASP.Net Web Configuration Manager」
發生 CS0122: 'System.Configuration.StringUtil' 的保護層級導致無法對其進行存取 的錯誤
要如何解呢?
環境: Windows 10, VS2013, VS2015
在論壇上有看到「關於Visual studio 2010的Asp.net組態設定錯誤訊息」,
依錯誤在網路上查詢「Accessing the ASP.NET Web Configuration Tool in Visual Studio 2013」這篇文章。
發現如果要使用「ASP.Net Web Configuration Manager」可以手動來啟動。
以系統管理員身份啟動 IISExpress 來 Host ASP.NETWebAdminFiles 指令如下,
"C:\Program Files\IIS Express\iisexpress.exe" /path:C:\Windows\Microsoft.NET\Framework\v4.0.30319\ASP.NETWebAdminFiles /vpath:"/ASP.NETWebAdminFiles" /port:8888 /clr:4.0 /ntlm
參數 port 可以指定未使用的 port number,我是使用 8888。
再來就可以開啟要設定的 Web Site 專案,例如我的Path是在 D:\WebSite1
結果就出現了 CS0122: 'System.Configuration.StringUtil' 的保護層級導致無法對其進行存取 的錯誤,如下,
查看 MSDN StringUtil 的內容是 internal ,所以外部來 Call 的確是會有問題。
不過 WebAdminPage.cs 行: 989 的程式是透過字串來取得一個Hash的字串,似乎可以改用 String.GetHashCode() 來達到相同的效果。
所以筆者就將 WebAdminPage.cs 行: 989 的程式
string appId = StringUtil.GetNonRandomizedHashCode(String.Concat(appPath, appPhysPath)).ToString("x", CultureInfo.InvariantCulture);
改成
string appId = String.Concat(appPath, appPhysPath).GetHashCode().ToString("x", CultureInfo.InvariantCulture);
或是透過 Reflection 來呼叫 GetNonRandomizedHashCode ,如下,
Assembly sysConfig = Assembly.LoadFile(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Configuration.dll");
Type sysConfigType = sysConfig.GetType("System.Configuration.StringUtil");
string appId = ((int)sysConfigType.GetMethod("GetNonRandomizedHashCode")
.Invoke(null, new object[]{String.Concat(appPath, appPhysPath), true}))
.ToString("x", CultureInfo.InvariantCulture);
存檔後,再重新整理網頁,輸入本機的帳密後,就可以進入管理的畫面,如下。
參考資料
關於Visual studio 2010的Asp.net組態設定錯誤訊息
Accessing the ASP.NET Web Configuration Tool in Visual Studio 2013
StringUtil.cs
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^