powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Динамические сборки
5 сообщений из 5, страница 1 из 1
Динамические сборки
    #38827758
cclord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сборка, которая компилится во время выполнения программы. Я ее подключаю путем добавления в новый домен, использую, выгружаю домен вместе со сборкой. Но когда повторно пытаюсь компилить то мне отказано в доступе :(

Подскажите пожалуйста, возможно ли как то решить эту проблему?
...
Рейтинг: 0 / 0
Динамические сборки
    #38827779
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cclordПодскажите пожалуйста, возможно ли как то решить эту проблему?
Подсказываю - скорее всего, можно... Если Вы приведете детали ошибки... на языке оригинала... Будет еще проще, если тестовый солюшен будет тоже...
P.S.: если не wcf - все работает?
P.P.S.: скорее всего, неверно работаете с доменами приложений... и вообще - ни чего не понятно из вашего сообщения...
...
Рейтинг: 0 / 0
Динамические сборки
    #38827787
cclord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary2
{
    public interface IExtension
    {
        String GetExtensionName();
    }
}



Сборка
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ClassLibrary2;

namespace ClassLibrary1
{
    public class Extension1 : MarshalByRefObject, IExtension
    {
        public Extension1()
        {
        }

        public string GetExtensionName()
        {
            return "Extension 1 from " + AppDomain.CurrentDomain.FriendlyName;
        }
    }
}



И само приложение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
namespace ConsoleApplication7
{
    class Program
    {
        static IEnumerable<IExtension> extensions;
        static void Main(string[] args)
        {
            // Создаём домен приложения, в котором будут выполняться расширения.
            AppDomain domain = CreateDomain(Directory.GetCurrentDirectory());
            try
            {
                // Получаем список экземпляров расширений.
                extensions = EnumerateExtensions(domain);
                foreach (IExtension extension in extensions)
                    // Выполняем метод расширения. Выполнение происходит в другом домене.
                    Console.WriteLine(extension.GetExtensionName());

                // Выгрузка домена приведёт к ожидаемому результату. Ни одна сборка не зависнет.
                
                UnloadDomain(domain);
            }
            finally
            {
                domain = null;
                GC.Collect(2);
                extensions = null;
            }

            Console.ReadKey();
        }

        /// <summary>
        /// Возвращает перечисление содержащее плагины.
        /// </summary>
        /// <param name="domain">Домен, в который будут загружатся исследуемые сборки.</param>
        private static IEnumerable<IExtension> EnumerateExtensions(AppDomain domain)
        {
            IEnumerable<string> fileNames = Directory.EnumerateFiles(domain.BaseDirectory, "*.dll");
            if (fileNames != null)
            {
                foreach (string assemblyFileName in fileNames)
                {
                    foreach (string typeName in GetTypes(assemblyFileName, typeof(IExtension), domain))
                    {
                        System.Runtime.Remoting.ObjectHandle handle;
                        try
                        {
                            handle = domain.CreateInstanceFrom(assemblyFileName, typeName);
                        }
                        catch (MissingMethodException)
                        {
                            continue;
                        }
                        object obj = handle.Unwrap();
                        IExtension extension = (IExtension)obj;
                        yield return extension;
                    }
                }
            }

        }

        /// <summary>
        /// Возвращает перечисление имён классов, которые реализуют заданный интерфейс.
        /// Сборка загружаются в указанный домен.
        /// </summary>
        /// <param name="assemblyFileName">Имя файла анализируемой сборки</param>
        /// <param name="interfaceFilter">Искомый интерфейс</param>
        /// <param name="domain">Домен для загрузки сборки.</param>
        /// <returns>Перечисление полных имён классов.</returns>
        private static IEnumerable<string> GetTypes(string assemblyFileName, Type interfaceFilter, AppDomain domain)
        {
            Assembly asm = domain.Load(AssemblyName.GetAssemblyName(assemblyFileName));
            Type[] types = asm.GetTypes();
            foreach (Type type in types)
            {
                if (type.GetInterface(interfaceFilter.Name) != null)
                {
                    yield return type.FullName;
                }
            }
        }

        /// <summary>
        /// Создаёт новый домен.
        /// </summary>
        /// <param name="path">Папка для поиска загружаемых сборок.</param>
        /// <returns>Новый домен приложения.</returns>
        static AppDomain CreateDomain(string path)
        {
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = path;
            return AppDomain.CreateDomain("Temporary domain", null, setup);
        }

        /// <summary>
        /// Выгружает домен приложения.
        /// </summary>
        /// <param name="domain">Домен подлежащий выгрузке.</param>
        static void UnloadDomain(AppDomain domain)
        {            
            AppDomain.Unload(domain);
        }
    }
}



Так вот когда в методе Main выполнился Console.ReadKey(); я пытаюсь удалить сборку, то мне отказано в доступе, но по идеи уже домен выгружен, или я не так понимаю логику работы ?
...
Рейтинг: 0 / 0
Динамические сборки
    #38828566
cclord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема решена
...
Рейтинг: 0 / 0
Динамические сборки
    #38828706
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cclord, пример из MSDN помог?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Динамические сборки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]