亚洲国产第一_开心网五月色综合亚洲_日本一级特黄特色大片免费观看_久久久久久久久久免观看

Hello! 歡迎來到小浪云!


探索 dotnet core 為何在 Windows7 系統需要補丁的原因


探索 dotnet core 為何在 Windows7 系統需要補丁的原因 alt=”探索 dotnet core 為何在 windows7 系統需要補丁的原因” />

在一些 Windows 7 系統上,根據 dotnet 官方文檔,需要安裝上 KB2533623 補丁,才能運行 dotnet core 或 .NET 5 等應用。盡管非所有的設備都需要安裝此,但這也讓應用的分發不便,安裝包上都需要帶上補丁給用戶安裝。此補丁同時也要求安裝完成之后重啟系統,這對用戶端來說,也是較不方便。本文來聊聊為什么 dotnet core 一系的框架依賴于此補丁

特別感謝 lsj 給我講解 Win32 調用部分的知識和幫我調查具體的原因,我只是記錄的工具

補丁

開始之前,先來理一下所需補丁的情況,不想看補丁細節還請跳到下文主題這章。準確來說,在當前 2021.12.25 官方推薦 Win7 系統打上的補丁是 KB3063858 補丁

也有伙伴推薦給我的是安裝 KB4457144 補丁。但是 KB4457144 補丁太大了,包含太多內容,帶上這個補丁沒什么優勢

gitHub 上的 Security update KB2533623 no longer available · issue #20459 · dotnet/docs 討論上,有大佬表示 KB3063858 或 KB4457144 包含了 KB2533623 補丁內容:

值得一說的是對需要安裝 KB3063858 補丁的系統來說,大多數都需要額外加上證書,參閱 https://www.microsoft.com/pkiops/Docs/Repository.htm 因此我認為對于客戶端分發來說,打上 KB2533623 補丁似乎更好。但是 KB2533623 當前被微軟下架了,請看 Security update KB2533623 no longer available · Issue #20459 · dotnet/docs

這是 KB2533623 的下載地址: http://www.microsoft.com/download/details.aspx?familyid=c79c41b0-fbfb-4d61-b5d8-cadbe184b9fc

另外,在剛推送 dotnet core 3.0 的預覽版本時,有伙伴在 wpf 官方倉庫反饋說需要加上 KB2999226 補丁。此 KB2999226 補丁是 Windows 中的 Universal C Runtime 更新 的內容,參閱 https://github.com/dotnet/wpf/issues/2009#issuecomment-543872453

也許可以使用 runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets NuGet 庫 代替 KB2999226 補丁內容,只需要將 api-xxxxx.dll 這些文件拷貝到輸出路徑即可。或者是解包 Vc++ 2015 的分發包里的文件,將 api-xxxxx.dll 和 ucrtbase.dll 拷貝到輸出路徑即可

因此,對于客戶端分發來說,似乎采用 KB2533623 最小補丁,然后在輸出路徑上拷貝好 api-xxxxx.dll 這些文件到輸出路徑是最佳方法

下載地址:

KB2533623 x86MD5:EDF1D538C85F24EC0EF0991E6B27F0D7SHA1:25BECC0815F3E47B0BA2AE84480E75438C119859KB2533623 x64MD5:0A894C59C245DAD32E6E48ECBDBC8921SHA1:8A59EA3C7378895791E6CDCA38CC2AD9E83BEBFFKB3063858 32-bitKB3063858 64-bit主題

清理好了各個補丁的關系之后,咱回到主題。為什么在 dotnet core 一系都有此要求?而且還不是對所有 Win7 系統都有此要求,這是為什么?回答這兩個問題,可以從 dotnet core 的 dotnet host core run 開始聊起

在 Windows 下,咱雙擊運行的 dotnet core 的可執行 exe 文件,其實是一個 AppHost 文件。咱編寫的 Main 函數,在非單文件模式下,是放在同名的 dll 里面。詳細關于 AppHost 請參閱 dotnet core 應用是如何跑起來的 通過AppHost理解運行過程

在 dotnet host core run 里,對應代碼是 srccoreclrhostscoreruncorerun.hpp 文件,在這里需要拉起 hostpolicy.dll 組件。加載此組件的代碼如下,不過代碼內容不重要哈

代碼語言:JavaScript代碼運行次數:0運行復制

    inline bool try_load_hostpolicy(pal::string_t mock_hostpolicy_value)    {        const char_t* hostpolicyName = W("hostpolicy.dll");        pal::mod_t hMod = (pal::mod_t)::GetModuleHandleW(hostpolicyName);        if (hMod != nullptr)            return true;        // Check if a hostpolicy exists and if it does, load it.        if (pal::does_file_exist(mock_hostpolicy_value))            hMod = (pal::mod_t)::LoadLibraryExW(mock_hostpolicy_value.c_str(), nullptr, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);        if (hMod == nullptr)            pal::fprintf(stderr, W("Failed to load mock hostpolicy at path '%s'. Error: 0x%08xn"), mock_hostpolicy_value.c_str(), ::GetLastError());        return hMod != nullptr;    }

相關閱讀