Динамическое подключение DLL на C#
От: vitek078  
Дата: 15.02.08 18:32
Оценка:
Здравствуйте! У меня возникла следующая проблема. Я хочу подключать библиотеки во время выполнения программы... В моем случае я написал тестовое приложение, которое выводит методы public, реализованные в библиотеке. Все вроде работает нормально. НО! Если у моей библиотеки при сборке в References есть другая, сторонняя, библиотека и объявлены переменные типов той библиотеки из References, то выдается исключение... Как бороться с этим? Как правильно подключить мою библиотеку, которая использует методы другой библиотеки?
Вот код:
Моё приложение (библиотеки ищутся в папке Plugins)

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;

namespace PluginSearcher
{
    class Program
    {
        static void SearchAndAddPlugins(string path)
        {
            DirectoryInfo di = new DirectoryInfo(path);
            foreach (FileSystemInfo fsi in di.GetFileSystemInfos())
            {
                if (fsi is FileInfo)
                {
                    try
                    {
                        Assembly asm = Assembly.LoadFile(fsi.FullName);
                        Console.WriteLine("Plugin name: " + fsi.Name);

                        Type[] alltypes = asm.GetTypes();
                        Type t = alltypes[0];

                        Console.WriteLine("Plugin's DLL Class: " + t.Name);
                        ConstructorInfo[] ci = t.GetConstructors();

                        ParameterInfo[] cpi = ci[0].GetParameters();
                        object reflectOb;

                        if (cpi.Length > 0)
                        {
                            object[] consargs = new object[cpi.Length];

                            for (int n = 0; n < cpi.Length; n++)
                                consargs[n] = 10 + n * 20;

                            reflectOb = ci[0].Invoke(consargs);
                        }
                        else
                            reflectOb = ci[0].Invoke(null);

                        MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);

                        foreach (MethodInfo m in mi)
                        {
                            Console.WriteLine("Method: {0}", m.Name);
                            ParameterInfo[] pi = m.GetParameters();
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Exception: " + ex.Message);
                    }
                }
                else
                {
                    SearchAndAddPlugins(fsi.FullName);
                }
            }
        }

        static void Main(string[] args)
        {
            if (Directory.Exists(Path.Combine(Directory.GetCurrentDirectory(), "Plugins")))
            {
                Console.WriteLine("Directory Plugins exist! Searching plugins...");
                SearchAndAddPlugins(Path.Combine(Directory.GetCurrentDirectory(), "Plugins"));
            }
            else
                Console.WriteLine("Directory Plugins not exist");

            Console.ReadKey();
        }
    }
}
Re: Динамическое подключение DLL на C#
От: svyatogor Великобритания http://blog.veles.info
Дата: 18.02.08 22:20
Оценка:
Внешняя библиотека была добавлена из GAC? может быть это поможет.

Здравствуйте, vitek078, Вы писали:

V>Здравствуйте! У меня возникла следующая проблема. Я хочу подключать библиотеки во время выполнения программы... В моем случае я написал тестовое приложение, которое выводит методы public, реализованные в библиотеке. Все вроде работает нормально. НО! Если у моей библиотеки при сборке в References есть другая, сторонняя, библиотека и объявлены переменные типов той библиотеки из References, то выдается исключение... Как бороться с этим? Как правильно подключить мою библиотеку, которая использует методы другой библиотеки?

V>Вот код:
V>Моё приложение (библиотеки ищутся в папке Plugins)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.