Задать вопрос

Динамическое подключение C# библиотеки в .NET

Как не используя Referenses динамически подключить внешнию библиотеку ?
Необходимо реализовать задачу, если файл библиотеки отсутствует скомпилировать проект без нее.
  • Вопрос задан
  • 7577 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
trerums
@trerums
Первый же результат в гугле по запросу ".net load assembly dynamically": stackoverflow.com/questions/465488/can-i-load-a-ne...
Ответ написан
Комментировать
askeet
@askeet Автор вопроса
Есть 2-а проекта с одним интерфейсом одна либа другая программа , которая её динамически
подключает.

Почему-то программа считает что они несовместимы.
Можно, конечно сделать промежуточную dll c интерфейсом, но мне нельзя это делать.
Помогите.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LibClass
{
    public  interface IClass
    {
         void Write();
         int Ref(ref int f);
    }
}


На текущий момент решил проблему, только через строковый доступ , но считаю это не очень оптимально.

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



namespace My_Project.Trace
{

    class IncludeLibrary
    {
        public IncludeLibrary(string PathDll)
        {
            if (System.IO.File.Exists(PathDll))
            {
                Assembly Ass = Assembly.LoadFrom(PathDll);
                ListTypes = Ass.GetTypes(); // Чтение всех типов
                isValid = true;
            }
            else
            { 
                Console.WriteLine("Dll не найдена:" + PathDll);
            }
        }
        public bool isValid = false;

        public static bool operator ==(IncludeLibrary LibA, IncludeLibrary LibB)
        {
            if ((object)LibA != null && !LibA.isValid)
            {
                LibA = null;
            }

            if ((object)LibB != null && !LibA.isValid)
            {
                LibB = null;
            }
            return object.Equals(LibA, LibB);
        }

        public static bool operator !=(IncludeLibrary LibA, IncludeLibrary LibB)
        {
            return !(LibA == LibB);
        }


        public object DllClass(string FindClass, params object[] argsClass)
        {
            findDllClass = null;
            if (ListTypes != null)
            {
                foreach (Type type in ListTypes)
                {
                    if (type.FullName.Equals(FindClass))
                    {
                        findClassType = type;
                        if (argsClass != null)
                        {
                            findDllClass = Activator.CreateInstance(findClassType, argsClass);
                        }
                        else
                        {
                            findDllClass = Activator.CreateInstance(findClassType);
                        }
                    }
                }
                if (findDllClass == null)
                {
                    Console.WriteLine("Plugin"+ FindClass + " not find");
                }
            }
            return findDllClass;
        }


        /// <summary>
        ///  Запустить метод класса, найденный при вызове DllClass
        /// </summary>
        /// <param name="function"></param>
        /// <param name="argsClass"></param>
        /// <returns></returns>
        public object Method(string function, params object[] argsClass)
        {
            return Method(findDllClass, function, argsClass);
        }

        public object Method(object Class, string function, params object[] argsClass)
        {
            object ret = null;
            MethodInfo mi = null;
            bool InvokeCorrect = false;
            try
            {
                if (Class != null)
                {
                    mi = Class.GetType().GetMethod(function);
                    if (mi != null)
                    {
                        ret = mi.Invoke(Class, argsClass);
                        InvokeCorrect = true;
                    }
                }
            }
            catch
            {
                ret = null;
            }

            if (!InvokeCorrect)
            {
                Console.WriteLine(String.Format("{0}.{1} error in Plugin {2}", (Class != null) ? Class.GetType().Name : "null", function, (mi == null) ? "or function not find" : ""));
            }
            return ret;
        }
        object findDllClass = null;
        Type findClassType = null;
        Type[]  ListTypes = null;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы