顯示具有 .NET Framework 標籤的文章。 顯示所有文章
顯示具有 .NET Framework 標籤的文章。 顯示所有文章

2025年6月12日 星期四

取得測試專案路徑

場景:

被測試專案組件有以下敘述:

Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) ?? throw new NullReferenceException(), fileName)

專案本身啟動能正常執行,但因為測試專案無法取得被測試專案的Assembly.GetEntryAssembly().Location(組件路徑,通常是被測試專案的bin目錄)而拋出NullReferenceException。


解法:

改寫為以下敘述取得測試專案路徑即可正常測試。

Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), fileName)

測試專案顯示組件相依性問題

被測試專案組件如下

Serilog, Version=4.3.0.0

Serilog.Sinks.Async, Version=2.1.0.0

專案本身啟動能正常執行,

因為被測試專案csproj檔本身已有AutoGenerateBindingRedirects屬性,且內容為true;

但在引用該專案進行單元測試時,會拋出例外,FusionLog內容如下:


=== 繫結前狀態資訊 ===

...

正在呼叫組件 : Serilog.Sinks.Async, Version=2.1.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10。

===

...

記錄: 原則後參考: Serilog, Version=4.1.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10

...

警告: 比較組件名稱發現不符項目: 次要版本

錯誤: 無法完成組件的安裝 (hr = 0x80131040)。已終止探查。


此時要在測試專案csproj檔的第一個組態屬性群組新增GenerateBindingRedirectsOutputType屬性,且內容為true:


<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    <PropertyGroup>
        ... <!--↓↓↓在此插入↓↓↓-->         <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>

並重載測試專案即可正常測試。

2025年3月18日 星期二

Windows Forms建立SQLite連線時顯示Library e_sqlite3找不到的錯誤

版本:

VS2022 v17.13.3

SQLite-net v1.9.172


1. 使用新增Windows Forms App (.NET Framework)專案。

2. 安裝Nuget套件SQLite-net NuGet\Install-Package sqlite-net-pcl -Version [最新版]

3. 建立SQLite連線時顯示錯誤訊息:Library e_sqlite3找不到








解法:

1. 降版SQLitePCLRaw.lib.e_sqlite3至v2.0.7

參考來源:【茶包射手日記】.NET Framework 專案 SQLite 執行錯誤:找不到 e_sqlite3


2. 遷移package.config到PackageReference


























因為VS2022建立的Windows Forms App (.NET Framework)專案,

預設使用package.config管理Nuget套件,

但SQLite-net相依的SQLitePCLRaw NuGet套件在v2.1.0後需要使用PackageReference管理。


參考來源:Exception after updating from 2.0.8 to 2.1.0

參考來源:從 package.config 移轉到 PackageReference


2025年3月4日 星期二

使用ProcDump+WinDbg定位.NET Framework問題(筆記)

 1.首要條件

專案>右鍵>屬性>建置>輸出>進階(D)...>輸出>偵錯訊息(E):>僅限 Pdb












參考來源:.NET 知識高裝檢 - .pdb 檔、編譯最佳化與偵錯


2.執行ProcDump生成記憶體傾印檔案

procdump -accepteula -ma [TargetApp.exe] [D:\target-app_dumps]

  • -accepteula:自動接受終端使用者授權協議(EULA),避免在執行時出現提示

  • -ma:生成完整的記憶體傾印,包括所有的記憶體內容,提供最詳細的調試資訊

  • TargetApp.exe:目標應用程式的名稱,即需要監控的程式

  • D:\target-app_dumps:指定記憶體傾印檔案的儲存路徑


參考來源:ProcDump - Sysinternals


3.執行WinDbg分析問題


起手式
執行!sym noisy
    • 啟用詳細符號載入
執行.sympath+ [Pdb路徑]
    • 設定符號搜尋路徑
執行.reload
執行ld*
    • 強制載入符號
執行.loadby sos clr
    • 載入.NET類別資訊偵錯用
執行.chain
    • 檢查載入是否成功
再依問題類型下對應指令查詢

參考來源:真实案例大全

2024年12月30日 星期一

VS2022開啓.NETFramework4.0的專案

問題:

 1.VS2022開啓.NETFramework4.0的專案,出現以下錯誤。


2.因爲VS2022已不支援.NETFramework4.0。

3.就算手動安裝.NETFramework4.0會顯示以下提示而安裝失敗。


解法:
1.在nuget.org搜尋"Microsoft.NETFramework.ReferenceAssemblies.net40"
點擊Microsoft官方的package。

2.點擊Download package下載這個package。


3.用解壓縮軟體開啟這個package。

4.將這個package根目錄下的build\.NETFramework\v4.0內容解壓縮並覆蓋
%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0

5.重啟VS2022再開啟專案即可。

2021年7月19日 星期一

Nuget無法取得套件清單,顯示"無法建立 SSL/TLS 的安全通道"的錯誤









原因:Nuget於2020/04移除對TLS 1.0/1.1的支援。 
對策:執行以下指令即可。
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:32
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:64
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f /reg:32
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f /reg:64

2018年6月23日 星期六

單元測試需注意事項


狀況:
當使用TransactionScope將之前寫入資料庫動作撤銷,
專案有使用到EntityFramework及Dapper會遇到以下錯誤;

(1)顯示"No Entity Framework provider found for the ADO.NET provider with invariant name ‘System.Data.SqlClient'"錯誤
解法:EntityFramework的DbContext需新加建構式如下:

 public partial class xxxEntities {
public static xxxEntities Create() {
return new xxxEntities("name=xxxEntities");
}

private xxxEntities(string contextName) : base(contextName) {
var ensureDLLIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
}


參考:
[1]https://stackoverflow.com/questions/15088426/overriding-code-generated-dbcontext-constructor/15088572#15088572
[2]http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html

(2)Dapper使用SqlConnection
會顯示"已停用分散式交易管理員 (MSDTC) 的網路存取。請使用元件服務系統管理工具啟用 DTC,以使用 MSDTC 安全性設定中的網路存取"
解法:在連線字串增加enlist=False, 避免觸發MSTDC

2018年3月1日 星期四

SqlBulkCopy調整心得

場景:
從MySQL同步數個Table到MSSQL,採取先清空(Truncate Table)再寫入的策略;
因為某些Table筆數較多(約百萬筆),所以使用SqlBulkCopy類進行大量批次寫入。

做法:
1_取得各Table的筆數,設定SqlBulkCopy.BatchSize屬性=該Table筆數。

2_SqlBulkCopy.BulkCopyTimeout(逾時)設為0。

3_設定SqlBulkCopyOptions.TableLock,可以更快完成,但寫入期間會造成Table被鎖定。
→個人測試加入此選項反而增加30秒的寫入時間。