我試圖修改2個.exes以從1個位置加載DevExpress dll。更改.NET應用程序的程序集解析位置
「產品」文件夾中的.exes與啓動程序使用相同的.dll。我想避免必須將相同的.dlls放入Products目錄,而是將.exes從1個目錄讀回(啓動器目錄)。
我該如何做到這一點?
我試圖修改2個.exes以從1個位置加載DevExpress dll。更改.NET應用程序的程序集解析位置
「產品」文件夾中的.exes與啓動程序使用相同的.dll。我想避免必須將相同的.dlls放入Products目錄,而是將.exes從1個目錄讀回(啓動器目錄)。
我該如何做到這一點?
您可以處理AppDomain.AssemblyResolve事件,並從自己使用Assembly.LoadFile給FULLPATH它試圖解決的程序集的目錄加載的程序集。
實施例:
.
.
.
// elsewhere at app startup time attach the handler to the AppDomain.AssemblyResolve event
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
.
.
.
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
AssemblyName assemblyName = new AssemblyName(args.Name);
// this.ReadOnlyPaths is a List<string> of paths to search.
foreach (string path in this.ReadOnlyPaths)
{
// If specified assembly is located in the path, use it.
DirectoryInfo directoryInfo = new DirectoryInfo(path);
foreach (FileInfo fileInfo in directoryInfo.GetFiles())
{
string fileNameWithoutExt = fileInfo.Name.Replace(fileInfo.Extension, "");
if (assemblyName.Name.ToUpperInvariant() == fileNameWithoutExt.ToUpperInvariant())
{
return Assembly.Load(AssemblyName.GetAssemblyName(fileInfo.FullName));
}
}
}
return null;
}
你可以設置在assemblyBinding文件夾(或多個)路徑>探測::在的app.config爲公共語言運行庫privatePath標籤加載程序集時進行搜索。 這樣的代碼
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="libs" />
</assemblyBinding>
</runtime>
</configuration>
這是我的Program.cs文件:pastebin.com/Qkr08HCv如果我把所有他的DevExpress的文件到文件夾DevExpress的和它以外運行Form1上,它不除非我將dll放回與表單相同的位置,否則打開。我在Main()的最頂端放置了一個MessageBox(「Test」),當.dlls與exe不在同一個文件夾時它不會觸發,所以我無法調用AppDomain.CurrentDomain.AssemblyResolve + = CurrentDomain_AssemblyResolve;從那裏 – Kyle
這取決於它何時試圖加載這些類型。您必須能夠在必須解決DevExpress類型之前註冊事件處理程序。 – Jim
它看起來像是因爲您直接在您的Main方法中引用DevExpress類型,所以它必須在AssemblyResolve處理程序註冊之前加載這些類型 – Jim