简体   繁体   中英

Find references to loaded dlls

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;
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM