问题描述
我需要创建一个 C# 应用程序,我可以在其中动态加载和卸载 C++/CLI dll,所以我使用的是 appdomains。
我正在以这种方式加载 dll(在我的应用程序域中):
Assembly assembly = AppDomain.CurrentDomain.Load("dllName");
Type m_configType = assembly.GetType("typeName");
object m_configObject = Activator.CreateInstance(m_configType);
我可以加载 dll 并根据需要使用它,但问题是当代码运行我复制的最后一行代码时,dll 会加载到我的所有应用程序域中。
我该如何防止这种行为?
输出:
我会给你重新创建行为的项目代码:
AppdomainTest 项目 - Program.cs
static void Main(string[] args)
{
AppDomain appDomain = CreateAppDomain("PluginLoaderDomain");
PlugIn plugin = InstantiatePlugin("PluginLoader",appDomain);
Console.WriteLine("Main domain assemblies before loading:");
PrintLoadedAssemblies();
plugin.LoadRuntimeAssembly();
Console.WriteLine("Created appdomain assemblies:");
plugin.PrintLoadedAssemblies();
Console.WriteLine("Main domain assemblies after loading:");
PrintLoadedAssemblies();
Console.WriteLine("Unloading appdomain");
Console.WriteLine("");
Console.WriteLine("Main domain assemblies after unloading:");
AppDomain.Unload(appDomain);
PrintLoadedAssemblies();
IsUnloaded(plugin);
}
static AppDomain CreateAppDomain(string dllName)
{
AppDomainSetup setup = new AppDomainSetup()
{
ApplicationName = dllName,ConfigurationFile = dllName + ".dll.config",ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,ShadowcopyDirectories = "true",ShadowcopyFiles = "true"
};
AppDomain appDomain = AppDomain.CreateDomain(setup.ApplicationName,AppDomain.CurrentDomain.Evidence,setup);
return appDomain;
}
static PlugIn InstantiatePlugin(string dllName,AppDomain domain)
{
PlugIn plugIn = domain.CreateInstanceAndUnwrap(dllName,dllName + ".PlugIn") as PlugIn;
return plugIn;
}
static void IsUnloaded(PlugIn plugin)
{
bool unloaded = false;
try
{
Console.WriteLine(plugin.Name);
}
catch (AppDomainUnloadedException)
{
unloaded = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
if (unloaded)
{
Console.WriteLine("Appdomain unloaded.");
}
else
{
Console.WriteLine("Error! Appdomain not unloaded.");
}
}
PluginLoader 项目 - Plugin.cs
public class PlugIn : MarshalByRefObject
{
private string name;
public string Name { get { return name; } }
public void Initialize()
{
name = "PlugIn 1";
}
public void LoadRuntimeAssembly()
{
Assembly assembly = AppDomain.CurrentDomain.Load("dllName");
Type m_configType = assembly.GetType("typeName");
object m_configObject = Activator.CreateInstance(m_configType);
}
}
public void PrintLoadedAssemblies()
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Console.WriteLine("----------------------------------");
foreach (Assembly assembly in assemblies)
{
Console.WriteLine(assembly.FullName.Substring(0,assembly.FullName.IndexOf(',')));
}
Console.WriteLine("----------------------------------");
Console.WriteLine("");
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)