Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Assembly.LoadFile工作,但AppDomain.Load失败_C#_Appdomain_.net Assembly - Fatal编程技术网

C# Assembly.LoadFile工作,但AppDomain.Load失败

C# Assembly.LoadFile工作,但AppDomain.Load失败,c#,appdomain,.net-assembly,C#,Appdomain,.net Assembly,我想做一个简单的扩展应用程序,在运行时加载扩展,然后选择一个并基于接口(不使用MAF或MEF等)在所选扩展中执行一个方法,但加载AppDomain时会出现奇怪的错误。扩展dll和bin/Debug文件夹中它旁边的所有dll都在指定的文件夹中,我可以使用Assembly.LoadFile加载扩展dll。当我尝试AppDomain.load时,我得到一个FileNotFoundException,有人能告诉我为什么会发生这种情况吗?我的代码在下面 var extensionName = loaded

我想做一个简单的扩展应用程序,在运行时加载扩展,然后选择一个并基于接口(不使用MAF或MEF等)在所选扩展中执行一个方法,但加载AppDomain时会出现奇怪的错误。扩展dll和bin/Debug文件夹中它旁边的所有dll都在指定的文件夹中,我可以使用
Assembly.LoadFile
加载扩展dll。当我尝试
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) { }
}

尝试使用CurrentDomain

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

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

我刚刚看到Assembly.LoadFile在我尝试从程序集中实例化我的类型时给出了与AppDomain.Load相同的错误。所以问题是:我如何确定哪个文件实际上丢失了?错误消息中的文件存在,它必须是“或其依赖项”之一。我如何才能找到它要查找的文件?据我所知,所有依赖项都与主dllUse fuslogvw.exe位于同一文件夹中,用于解决程序集解析问题。永远不要使用LoadFile(),因为它不提供加载上下文。如果文件不在探测路径中,请考虑Load()。