我正在開發一個應用程序,它引用並使用某個供應商的某些第三方程序集;在開發框中我有這3個程序集在我的源代碼樹中的參考文件夾中,我可以引用它們並構建應用程序,應用程序構建但不運行,因爲整個服務器應用程序沒有安裝,但這很好。從另一個文件夾中解析程序集引用
在這裏我想複製此自定義應用程序並運行,我引用的所有組件都在文件夾類似服務器:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
,如果我複製我小的可執行文件,文件夾中,然後運行它,它作品完美,但如果我把我的.exe以更適當的文件夾,就像我想:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
這是行不通的,因爲它解決不了這些組件。
我知道我可以在app.config中使用探測來指定我的exe必須在哪個文件夾中查找引用,但是imy情況下程序集不在子文件夾中,更多位於完全不同的位置。
我不想在我的應用程序文件夾中複製所有供應商程序集,我不能在那裏只有3我引用,因爲他們也加載其他程序集,除非我擁有所有這些(很多...) , 這是行不通的。
我沒有做任何特殊的事情,沒有創建應用程序域,也沒有通過反射來加載程序集,只是希望CLR在應用程序啓動或執行時解析引用。
謝謝。
編輯:這裏的最終工作代碼
static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Logger logger = new Logger();
try
{
string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"];
Assembly MyAssembly = null;
string strTempAssmbPath = string.Empty;
Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
AssemblyName myAssemblyName = Array.Find<AssemblyName>(arrReferencedAssmbNames, a => a.Name == args.Name);
if (myAssemblyName != null)
{
MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase);
}
else
{
strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
if (!string.IsNullOrEmpty(strTempAssmbPath))
{
if (File.Exists(strTempAssmbPath))
{
logger.Information("Assembly to load: {0} - File was found in: {1}", args.Name, strTempAssmbPath);
// Loads the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
}
}
}
// Returns the loaded assembly.
return MyAssembly;
}
catch (Exception exc)
{
logger.Error(exc);
return null;
}
}
的可能重複的http:/ /stackoverflow.com/questions/1373100/how-to-add-folder-to-assembly-search-path-at-runtime-in-net – nawfal 2013-02-20 11:28:18