Каков стандартный/правильный способ загрузить C ++/CLI DLL в C# Appdomains?C#

Место общения программистов C#
Ответить
Anonymous
 Каков стандартный/правильный способ загрузить C ++/CLI DLL в C# Appdomains?

Сообщение Anonymous »

Мне нужно создать приложение C#, где я могу динамически загружать и разгрузить DLL C ++/CLI, поэтому я использую приложения.Assembly assembly = AppDomain.CurrentDomain.Load("dllName");
Type m_configType = assembly.GetType("typeName");
object m_configObject = Activator.CreateInstance(m_configType);
< /code>
Я могу загрузить DLL и использовать его так, как я хочу, но дело в том, что, когда код запускает последнюю строку кода, я скопировал, DLL загружается во всех моих приложениях. < /p>
Как я могу предотвратить это поведение? src = "https://i.sstatic.net/hbd03.png"/>
Я дам вам код проекта для воссоздания поведения:

appdomastest project - program.cs

appdomastest project.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);
}
< /code>
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;
}
< /code>
static PlugIn InstantiatePlugin(string dllName, AppDomain domain)
{
PlugIn plugIn = domain.CreateInstanceAndUnwrap(dllName, dllName + ".PlugIn") as PlugIn;

return plugIn;
}
< /code>
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.");
}
}
< /code>

PluginLoader Project - 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);
}
}
< /code>
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("");
}



Подробнее здесь: https://stackoverflow.com/questions/666 ... appdomains
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»