C # Динамическая загрузка / выгрузка DLL Redux (конечно, с помощью AppDomain)
Вы прочитали столько разных версий этого вопроса, сколько и в переполнении стека, а также каждую синюю ссылку на первой странице трех разных поисков в Google для учебных пособий, а также MSDN (что-то вроде мелкого за пределами выполнения сборок). Я могу думать только о своих попытках заставить Дао работать как хороший тестовый пример, но поверьте мне, ямы пробовали с простой строкой return, double, функцией с параметрами тоже. Какова бы ни была моя проблема, это нет Тао.
В основном я хочу создатьtestLibraryDomain.CreateInstance()
моего класса Draw в пространстве имен GLPlugin.
if( usePlugin )
{
AppDomain testLibraryDomain = AppDomain.CreateDomain( "TestGLDomain2" );
//What the heck goes here so that I can simply call
//the default constructor and maybe a function or two?
AppDomain.Unload( testLibraryDomain );
}
Gl.glBegin( Gl.GL_TRIANGLES );
Я точно знаю, что:
namespace GLPlugin
{
public class DrawingControl : MarshalByRefObject
{
public DrawingControl()
{
Gl.glColor3f( 1.0f , 0.0f , 0.0f );
//this is a test to make sure it passes
//to the GL Rendering context... success
}
}
}
действительно меняет цвет ручки. Это работает, когда я даю этоstatic void Main( string args[] )
точка входа и я звонюtestLibraryDomain.ExecuteAssembly( thePluginFilePath )
Работала ли прямая ExecuteAssembly, меня беспокоило, так как я не был уверен, что GL Calls превратится в "верхний уровень" AppDomain'с контекстом OpenGL. Он даже позволяет мне перезаписать сборку и изменить цвет пера во второй раз. К сожалению, предоставление ему исполняемой точки входа означает, что всплывающая консоль прерывает меня, а затем уходит. Это также работает, когда я просто даю ссылку в Проект и создаю регулярнуюGLPlugin.DrawingTool tool = new GLPlugin.DrawingControl()
или даже создаваяsomeAssembly = Assembly.LoadFrom( thePluginFilePath )
(что, конечно, и, к сожалению, блокирует сборку, предотвращая замену / перекомпиляцию).
При использовании любого из различных методов япробовал, всегда получаюданное имя сборки или его кодовая база недействительны. " Обещаю, это действительно. Что-то, как яЯ пытаюсь загрузить это не так.
Я знаю одном отсутствует правильная настройка дляtestLibraryDomain.CreateInstance( string assemblyName , string typeName);
Насколько я могу судить, аргумент assemblyName не является путем к файлу сборки. Это пространство имен или даже просто имя сборки, то есть:GLPlugin
? Если это так, где я могу сослаться на фактический файл? SomeAppDomain.LoadFrom (someFilename) не существует, хотя было бы чертовски удобно, если бы они были. Кроме того, какого черта это тип, и строка typeName в этом? Я нене хочу вставлять"Object"
здесь я, так как не создает тип, кроме экземпляра объекта? Я'мы также пыталисьCreateInstanceAndUnwrap( ... , ... )
с таким же отсутствием фундаментального понимания AppDomain. Обычно я могу перебирать уроки и заставлять вещи работать, хотя я часто нене понимаю "Зачем?"... здесь не так. Обычно для меня полезно посмотреть шесть различных учебных пособий ... не здесь снова, а потому, что каждый использует фундаментальный (или, как кажется, так) подход.
Поэтому, пожалуйста, ELI5 ... Я хочу загрузить экземпляр класса из dll в отдельный домен приложений, возможно, запустить несколько функций и выгрузить его. В конце концов создайте список этих функций как List, удаляя / обновляя при необходимости ... I 'я бы тоже хотел иметь возможность передавать им аргументы, но это будет шаг 2. Согласно StackOverflow, я должен узнать оserializable
который я отложу на другой день. (Я представляю тебясмогу понять из моего примера, что яя пытаюсь сделать.)