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