2016-06-17 97 views
7

我做了大量的研究,沒有找到任何合適的答案。這是場景。如何強制編譯的目標.NET Framework 4在.NET框架4.6.1下運行?

我有一個應用程序被編譯爲面向.NET Framework 4.在運行時我希望該應用程序在.NET Framework 4.6.1中實際執行。到目前爲止我發現了兩個選擇。

  1. 重新編譯應用程序下.NET框架4.6.1
  2. 添加的配置/啓動/ supportedRuntime元件與版本的app.config = 「4.0版」 SKU =」。NETFramework,版本= v4.6.1 「

選項1不可取,因爲它需要重新發布軟件。

選項2不會做我期望的。它似乎檢查是否安裝了CLR 4.0(不是框架4.0),如果不提示下載相應的SKU進行安裝。安裝後,應用程序仍然在.NET框架4.0

執行作爲測試,而這個問題是張貼的原因,我創建了一個小型控制檯應用程序,它只是做到這一點

Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol); 

如果編譯針對.NET框架4,則輸出是

SSL3,TLS

如果正在針對.NET編譯Framewo RK 4.6.1則輸出是

TLS,Tls11,Tls12

+2

http://stackoverflow.com/a/28502562/17034 –

+1

謝謝Hans。這確實解決了我的示例中的問題,並且是我們要使用的。我也對更大的問題的答案感興趣。你有機會知道這是否可能,如果是的話,如何? –

+1

Hmya,SecurityProtocolType的.NET 4.0版本沒有你喜歡的枚舉值。你的應用程序如何正確解釋屬性值是一個非常困難的猜測。但如果它起作用,那麼它就可以工作 –

回答

8

我...詢問有關強制對框架4.0編譯的應用程序使用框架4.6.1

好,我們已經與app.config文件條目做了運行的一般情況。它授權this feature,用戶無法在沒有安裝4.6.1的情況下先運行程序。他所要做的只是點擊是按鈕。不是經常這樣做,當用戶負責使用Windows Update更新他的機器時,4.6.1應始終存在於機器上。如果他故意不這樣做,那麼「強迫」就不太可能被很好地接受。

但這並不是你的問題所在。您希望您的程序的行爲就像它安裝在4.6.1上一樣。這是一個非常不同的水壺。請注意,2)不起作用,你不能輕易欺騙運行時。編譯器將TargetFrameworkAttribute attribute嵌入到您的可執行文件中,該文件是運行時用來確定其行爲方式的程序文件。用ildasm.exe查看一下,雙擊清單以查看它。你的app.config條目不會覆蓋它。

最大的問題是.NET 4.5與相當根本地不同在運行時和框架程序集中發生了重大變化。重量足以保證將版本提升到5.0。但是,這樣做總是會給客戶帶來很多痛苦和苦難,微軟在本書中剔除了每個竅門,如果它運行一個針對4.0的程序,4.5(和更高)的行爲就像4.0。

不只是一個把戲。一個核心方法是存儲在c:\ Program Files(x86)\ Reference Assemblies目錄中的參考程序集。他們存儲了定位包文件。您最初構建程序時,使用了存儲在C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0中的那些程序。如果您重新定位您的項目,那麼您將使用v4.6.1中存儲的項目。他們是非常不同的。值得注意的是,你所談論的SecurityProtocolType enum是不同的,它獲得了兩個新的價值。這是一個打破的變化,一個.NET 4.0程序在看到SecurityProtocolType.Tls12時很容易遭受心臟病發作,它不知道它可能意味着什麼。使用錯誤的定位包文件構建程序可能會導致deeply mystifying exceptions

等竅門。根據[TargetFrameworkAttribute]有選擇地啓用.NET 4.0發佈後發佈的錯誤修復,向後兼容錯誤對於確保程序不會觀察到更改的運行時行爲非常重要。 CLR通過appcompat開關充滿了這個邊緣。我可以指向CoreCLR中的源代碼文件,但它看起來完全是太可怕了:)

因此,編譯爲目標.NET 4.0的程序行爲就像它運行在更高版本上是不可能的。您瞭解的註冊表項和appcontext開關高度僅針對ServicePointManager.SecurityProtocol屬性。他們只是因爲你不是唯一想要這樣做的客戶,TLS版本相當重要。只要確保新的枚舉值不會影響您的程序。

+0

標記爲答案,因爲它似乎實際上不可能做我在問什麼。你的解釋包含很多細節和參考。謝謝漢斯。 –

+0

@GregBogumil你要做的就是強迫最終用戶破解 - 你不想升級你的編譯目標(爲什麼?),但是想強制一個新的運行時使用4.0中不存在的TLS值。真正的解決辦法是改變你的目標 –

3

具體ServicePointManager.SecurityProtocol確定是相當無關4的一般問題VS 4.6.1框架爲此,我害怕沒有明確的答案,因爲它在一般情況下並不相關(如果你願意的話,所有情況都可能是特定的)。

對於具體的答案,這說明如下:Mitigation: TLS Protocols

與.NET Framework 4.6,啓動 System.Net.ServicePointManager和System.Net.Security.SslStream 類允許使用以下三種協議之一: Tls1.0,Tls1.1或Tls 1.2。 SSL3.0協議和RC4密碼不支持 。

如果安裝了4.6+,那麼你的確可以改變你的程序的行爲W/O重新編譯,在文章中詳細介紹,只是添加此行到您的.config文件:

<configuration> 
    ... 
    <runtime> 
    ... 
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" /> 
    </runtime> 
    ... 
</configuration> 
+1

謝謝你的回答。我提出的這個例子強調了我想要確定的東西,這是非常有效的。在這個問題中,我正在詢問關於強制使用框架4.6編譯的應用程序的一般情況。我比CLR和框架之間的差異更加精通,並且明白強制使用不同的CLR運行是可以實現的。似乎基於這個問題的答案很好,可能是因爲沒有重新編譯應用程序到目標框架4.6.1就無法完成。 –

+1

特別感謝您對運行時配置的更改。根據大量研究,我迄今爲止的最佳答案是改變註冊表。在有時需要管理人員的客戶端機器上。 –

相關問題