2015-03-26 4 views
0

Ответьте на мой вопрос, что у меня уже есть stackoverflow, но я просто не могу найти правильный/не получить его для работы.Использование AppDomain для загрузки сборки

Что я пытаюсь сделать, загрузите .dll в мою Windows-форму, используйте отражение, чтобы получить имена методов/классов. У меня есть работа с Assembly.LoadFrom, но он делает именно то, что я хотел, поскольку это блокирует файл .dll.

Я прочитал и узнал, что AppDomain может сделать трюк, однако я просто не могу заставить его сделать трюк.

Ниже приведен код, который я пробовал, однако, в CreateInstanceFromAndUnwrap, я не знаю, который typeName он ищет.

var executableFilePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 

AppDomain domain = AppDomain.CreateDomain(
       DllPath, 
       null, 
       new AppDomainSetup 
       { 
        ApplicationBase = Path.GetPathRoot(executableFilePath), 
        PrivateBinPathProbe = string.Empty, 

        PrivateBinPath = string.Join(";", DllPath, executableFilePath), 
        ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, 
       }); 



     var temp = domain.CreateInstanceFromAndUnwrap(DllPath, typeof(????).FullName, false, 
      BindingFlags.Default, null, null, null, null); 

.dll, загружаемый во время выполнения, не будет ссылаться на мое приложение Windows Form.

+0

Является ли ваши Forms-App в том же App-домен? Недавно созданный и загруженный материал не будут автоматически разрешены для первоначального домена приложения –

+0

Как это проверить? –

ответ

0

Попробуйте посмотреть эту тему: How to Load an Assembly to AppDomain with all references recursively?

Метод CreateInstanceFromAndUnwrap возвращает вам прозрачный прокси из вашего TYPEOF (????) FullName.. Таким образом, вы должны:.

  1. создать некоторый класс, унаследованный от MarshalByRefObject в вашем импорте DLL
  2. использование TYPEOF (% yourNewMarshalByRefClassNameFrom1%) FullName
+0

Я пробовал верный ответ на этот вопрос и продолжал сжимать меня и ошибку, когда я делаю 'value.GetAssembly (ReferenceDll)' .... Не удалось загрузить файл или сборку 'Gamers_V1_0_0, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null или одной из его зависимостей. Система не может найти указанный файл'. –

+0

Попробуйте проверить свой путь к локальному каталогу, возможно, другой. 'var currentDir = Path.GetDirectoryName (Assembly.GetExecutingAssembly(). Location); var assemblyFullPath = Path.Combine (currentDir, «имя сборки»); ' – bazarniy

+0

Я пробовал' if (File.Exists 'однако он передает это и дает мне ту же ошибку –

Смежные вопросы