這是很明顯的,我認爲,但我想還是要問:哪個CLR會使用爲不同版本的.net編譯的DLL使用的應用程序?
如果一個應用程序(EXE)被編譯在.NET 3.5運行,並且如果它使用的DLL編譯爲.NET 1.1中會自動DLL使用2.0 CLR,即父母?
反之亦然呢?
如果是這樣,兼容性問題呢?
這是很明顯的,我認爲,但我想還是要問:哪個CLR會使用爲不同版本的.net編譯的DLL使用的應用程序?
如果一個應用程序(EXE)被編譯在.NET 3.5運行,並且如果它使用的DLL編譯爲.NET 1.1中會自動DLL使用2.0 CLR,即父母?
反之亦然呢?
如果是這樣,兼容性問題呢?
這是EXE文件,它決定進程將使用哪個.NET運行時版本。爲早期版本的.NET編譯的任何程序集都必須使用「進程版本」。這通常是很有用的,因爲.NET幾乎沒有什麼重大變化。
使用.NET 1.1 DLL的.NET 3.5應用程序將在CLR 2.0上運行該DLL(.NET 2.0,3.0和3.5都使用相同的CLR 2.0版本)。
.NET 4有一個新的CLR和.NET程序4的新功能之一是in-process side by side CLR hosting允許multipe版本of.NET在同一進程,並可能改變答案..
不。如果你的目標是3.5版本的框架,它不會神奇地使用2.0,如果3.5不存在。
但是你可以使用assemblybinding
bindingredirect
在app.exe.config
指定替換版本:
<configuration>
....
<runtime>
<assemblybinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentassembly>
<assemblyidentity name="System" culture="neutral" publickeytoken="969db8053d3322ac" />
<bindingredirect newVersion="2.0.0.0" oldVersion="1.0.5000.0" />
</dependentassembly>
<dependentassembly>
<assemblyidentity name="System.Windows.Forms" culture="neutral" publickeytoken="969db8053d3322ac" />
<bindingredirect newVersion="2.0.0.0" oldVersion="1.0.5000.0" />
</dependentassembly>
</assemblybinding>
</runtime>
</configuration>
如果應用程序使用的框架3.5(這是真正CLR 2),它加載編譯的DLL對於CLR 1.0或CLR 1.1,那麼這些DLL將自動使用CLR 2. 你不能走另一條路 - 即。您無法將CLR 2 DLL加載到CLR 1進程中,而不會受到任何傷害。
在CLR 4中,這些規則會有所改變,因爲您現在可以在給定進程中擁有多個CLR實例,但這只是在您通過COM實例化對象時才相關,而不是通過正常反射進行加載。
米奇。你的回答不清楚。你是說DLL WONT使用父級運行時?如果不是,是否加載了2個CLR? – bobbyalex 2010-02-21 10:27:05
@Bobby Alexander:你能否澄清你的問題。 – 2010-02-21 10:33:33
Mitch,我想知道的是:如果一個exe是爲framework 3.5構建的,但它使用的DLL(引用)是建立在.net 1.1上的,那麼這個dll會自動運行在2.0 CLR上(與父代相同)? – bobbyalex 2010-02-22 05:51:37