I have an application that can be customized by writing custom extensions. All of them are in proj\Extensions
folder. At runtime my Core
project loads every extension from the folder and executes code. The problem is when one of the extensions uses additional libraries, because the Core
project cannot find reference to these additional libraries.
So for example in my Core
project I have:
public void Preview(IFileDescription fileDescription)
{
var extension = Path.GetExtension(fileDescription.FilePath);
var reader = _readerFactory.Get(extension);
Data = reader.GetPreview(fileDescription);
}
In one of my extensions I have
public DataTable GetPreview(IFileDescription options)
{
var data = new DataTable();
using (var stream = new StreamReader(options.FilePath))
{
var reader = new CsvReader(stream); // <- This is from external library and because of this Core throws IO exception
}
/*
...
*/
return data;
}
Core
only knows about the interface, so when one of readers uses for example CsvHelper.dll
I get exception of FileNotFound
, because Core
cannot find CsvHelper.dll
. Is there any way to tell the compiler to look for additional libraries in specific folder? I used Reference Paths
, but it didn't solve the problem. It still threw the same exception.
Yes, it's possible. You can attach to the AppDomain.AssemblyResolve event and manually load the required DLLs from your add-in directory. Execute the following code before executing any add-in code:
var addinFolder = ...;
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
var missing = new AssemblyName(e.Name);
var missingPath = Path.Combine(addinFolder, missing.Name + ".dll");
// If we find the DLL in the add-in folder, load and return it.
if (File.Exists(missingPath))
return Assembly.LoadFrom(missingPath);
// nothing found, let .NET search the common folders
return null;
};