Мне нужно создать приложение 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
Каков стандартный/правильный способ загрузить C ++/CLI DLL в C# Appdomains? ⇐ C#
Место общения программистов C#
1756979790
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("");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/66694487/what-is-the-standard-correct-way-to-load-c-cli-dll-into-c-sharp-appdomains[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия