Assembly.LoadFile работает, но AppDomain.Load не работает - PullRequest
1 голос
/ 23 ноября 2011

Я хочу создать простое приложение Extension, которое загружает расширения во время выполнения, затем выбирает одно и выполняет метод в выбранном расширении на основе интерфейса (не использует MAF или MEF и т. Д.), Но я получаю странные ошибки при загрузке AppDomain,Расширение dll и все dll, расположенные рядом с ним в папке bin / Debug, находятся в указанной папке, и я могу загрузить расширение dll, используя Assembly.LoadFile, однако, когда я пытаюсь AppDomain.Load, я получаю FileNotFoundException, может кто-нибудь подсказатьпочему это произойдет?Мой код ниже

var extensionName = loadedExtension.Name;
var extensionFolder = Path.Combine(extensionsRootDirectory, extensionName);
if (!Directory.Exists(extensionFolder)) continue;

Assembly assmbl = null;
IProvider provider = null;
string assemblyName = null;
//Find entry point Assembly
foreach (var filePath in Directory.GetFiles(extensionFolder, "*.dll"))
{
    try
    {
        assmbl = Assembly.LoadFile(filePath); //This loads the assembly without problems
        var types = assmbl.GetTypes();
        var providerType = (from t in assmbl.GetTypes()
            where t.GetInterface(typeof(IInfonProvider).Name) != null
            select t).FirstOrDefault();
        if (providerType != null)
        {
            assemblyName = assmbl.FullName;
            provider = assmbl.CreateInstance(providerType.FullName) as IInfonProvider;
            break;
        }
    }
    catch (Exception) { /*Continue, will handle problem if no file was loaded from folder*/ }
}

if (assemblyName != null)
{
    try
    {                       
        var appDomainSetup = new AppDomainSetup()
            {
                //ApplicationName = extensionName,
                //DynamicBase = extensionFolder,
                ApplicationBase = extensionFolder,
                PrivateBinPath = extensionFolder
            };

        var extensionDomain = AppDomain.CreateDomain(extensionName, AppDomain.CurrentDomain.Evidence, appDomainSetup);
        extensionDomain.Load(assemblyName); //This gives FileNotFoundException - Could not load file or assembly 'CNSProvider,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its
dependencies. The system cannot find the file specified.
    }
    catch (Exception) { }
}

1 Ответ

2 голосов
/ 23 ноября 2011

попробуйте использовать CurrentDomain

string fileToLoad = @"C:\myApp.dll";

AssemblyName assamblyName = AssemblyName.GetAssemblyName(fileToLoad);
AppDomain myDomain = AppDomain.CurrentDomain;                     
Assembly myAssambly = myDomain.Load(assamblyName);
...