[.NET]CS0122: 'System.Configuration.StringUtil' 的保護層級導致無法對其進行存取

使用「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。

image

 

再來就可以開啟要設定的 Web Site 專案,例如我的Path是在 D:\WebSite1

http://localhost:8888/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=D:\WebSite1&applicationUrl=/

 

結果就出現了 CS0122: 'System.Configuration.StringUtil' 的保護層級導致無法對其進行存取 的錯誤,如下,

image

 

查看 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);

 

 

存檔後,再重新整理網頁,輸入本機的帳密後,就可以進入管理的畫面,如下。

image

 

參考資料

關於Visual studio 2010的Asp.net組態設定錯誤訊息

Accessing the ASP.NET Web Configuration Tool in Visual Studio 2013

String.GetHashCode()

StringUtil.cs

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^