我希望能夠在運行時加載數據庫驅動程序程序集並執行到服務器的連接。.net core:在運行時加載程序集及其非託管依賴關係
例如,在一個控制檯應用程序我想從我的NuGet包加載SQLite的驅動和負載類型:SqliteConnection。在這裏我的僞代碼:
string path = Path.Combine(NugetPackagesDir, @"microsoft.data.sqlite\1.1.0\lib\netstandard1.3\Microsoft.Data.Sqlite.dll");
var myAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
var myType = myAssembly.GetType("Microsoft.Data.Sqlite.SqliteConnection");
IDbConnection cnn = (IDbConnection)Activator.CreateInstance(myType);
cnn.ConnectionString = "Data Source=:memory:";
cnn.Open();
它的工作原理,直到cnn.Open()點,它失敗找到一個非託管的依賴:
System.DllNotFoundException: '無法加載DLL' 的sqlite3 「
我有與SQL Server和本地依賴相同的行爲:
System.DllNotFoundException:「無法加載DLL‘如果我複製DLL在它工作的驅動程序包,但我覺得這種想法不便於sni.dll’
。
UPDATE
我不知道的前期哪些類型的DbConnection我有實例,也沒有我的操作系統。
上下文是我的庫實現了Microsoft.Build.Utilities.Task
,並且在項目構建後由MsBuild.exe啓動。 所以我有$(TargetPath)我想要DbConnection
(和驅動程序程序集名稱在配置文件或其他地方)的應用程序。
在.NET世界中,所有程序集(託管或不)都位於調試/發佈文件夾$(TargetPath)或GAC中。 但在.net核心,我只有deps.json文件。
所以我的猜測:使用DependencyContext
類讀取deps.json文件。 查找它使用的數據庫驅動程序,並將該程序集及其所有依賴項(取決於操作系統)複製到臨時文件夾中,最後我可以實例化DbConnection
類。
更新2
我的目標是能夠,建造後,要運行的使用NuGet包我開發的應用程序的SQL遷移腳本。 所以我的代碼在MSBuild任務內部運行,而不是在目標應用程序中運行。
生成後,MsBuild任務加載目標項目app.config文件(for。NET),這應該申報像一些變量:在項目
- 數據庫驅動程序...
有了這些數據然後我創建一個DbConnection並運行在指定文件夾中找到的腳本。
你能澄清幾件事嗎?這個MSBuild任務將如何使用?它將如何確定使用哪種類型的DbConnection?連接字符串從哪裏來?一個正確的實現將取決於你是否試圖從MSBuild正在編譯的應用程序運行代碼,或者只是試圖在構建步驟中運行MSBuild內的某些東西。 – natemcmaster
我更新了我的答案。你想要做的是很難的。我提出了一個更簡單的方法,但是一個完整的解決方案在堆棧溢出答案中描述得太長。 – natemcmaster