我做网络。通过输入参数加载程序集文件的服务。然后在汇编中会尝试查找特定类型(从特定接口继承),创建实例并返回方法的结果。
我需要再次释放程序集的调用。
从方法的输入参数中,我在 web.config 中找到程序集的路径。并尝试加载它。
这是有效的代码:
[WebMethod]
public String[] GetData(String confKey)
{
var assemblyPath = ConfigurationManager.AppSettings[confKey];
var assembly = Assembly.LoadFrom(assemblyPath);
List<String> retVals = new List<String>();
foreach (var t in assembly.GetTypes())
{
if (t.ImplementsInterface(typeof(IMyServiceProvider)))
{
IMyServiceProvider objectInstance = Activator.CreateInstance(t) as IMyServiceProvider;
retVals.Add(objectInstance.GetData());
}
}
return retVals.ToArray();
}
但是这样我可以删除加载的程序集或替换它,因为文件被“锁定”。
所以我尝试采用不同的方式将程序集加载到自己的 AppDomain 中,如下所示:
[WebMethod]
public String[] GetData(String confKey)
{
var assemblyPath = ConfigurationManager.AppSettings[confKey];
var tmp = String.Concat("AppDomain", Guid.NewGuid().ToString("N"));
AppDomain dom = AppDomain.CreateDomain(tmp, null, AppDomain.CurrentDomain.SetupInformation);
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = assemblyPath;
Assembly assembly = dom.Load(assemblyPath);
List<String> retVals = new List<String>();
foreach (var t in assembly.GetTypes())
{
if (t.ImplementsInterface(typeof(IMyServiceProvider)))
{
IMyServiceProvider objectInstance = Activator.CreateInstance(t) as IMyServiceProvider;
retVals.Add(objectInstance.GetData());
}
}
AppDomain.Unload(dom);
return retVals.ToArray();
}
但是这个解决方案被抛出异常:
无法加载文件或程序集“NameOfMyAssembly”或其依赖项之一。给定的程序集名称或代码库无效。(HRESULT 异常:0x80131047)-在 System.Reflection.AssemblyName.nInit(RuntimeAssembly 和程序集,布尔 forIntrospection,布尔 raiseResolveEvent)在 System.Reflection.RuntimeAssembly.CreateAssemblyName(字符串 assemblyString,布尔 forIntrospection,RuntimeAssembly 和 assemblyFromResolveEvent)在 System.Reflection.RuntimeAssembly System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) 在 System.AppDomain
为什么第一个解决方案程序集加载没有问题,而第二个则抛出错误?谢谢