Как создать экземпляр класса, который объявлен в C # DLL? - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть DLL, написанная на C #.В этой DLL есть класс, который определен.Давайте предположим, что код этой DLL:

namespace unloadableDLL
{
    public class DivisionClass
    {
        public /*static*/ long Division(long x, long y)
        {
            // We deliberately do not use a try catch to catch divide by 0 exceptions
            return (x / y);
        }
    }
}

Теперь я хочу динамически загрузить эту DLL в тестовую программу.Мне нужно посмотреть, что произойдет, если я разделю на ноль в двух следующих случаях: 1) DLL загружается напрямую (без использования AppDomain) 2) DLL не загружается напрямую, сначала создается AppDomain, а затем загружается DLL.

Я полностью новичок в C #, под новым я имею в виду, что я начал менее 4 часов назад, но у меня есть фон C ++.

Моя проблема в том, что в моей тестовой программе мне нужнодля создания объекта DivisionClass, но этот объект объявлен только в DLL.=> Решено

Моя тестовая программа

class Program
    {
        [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
        static void Main(string[] args)
        {
            // Load the DLL
            Console.WriteLine("Attempting to load unloadableDLL");
            Assembly a = Assembly.LoadFrom("./unloadableDLL.dll");
            unloadableDLL.DivisionClass divisionObject = (unloadableDLL.DivisionClass)a.CreateInstance("unloadableDLL.DivisionClass");
            long number = divisionObject.Division(8, 2);
            Console.WriteLine(number);
        }
    }

Я не знаю, что, но компиляторы постоянно говорят мне, что статический член unloadableDLL.DivisionClass.Division (длинный, длинный) недоступенсо ссылкой на экземпляр;вместо этого уточните имя типа.

Спасибо всем

1 Ответ

3 голосов
/ 23 февраля 2012

Чтобы загрузить в отдельный домен AppDomain команду, выполните метод оттуда - используйте отражение, как показано в следующем вопрос StackOverflow .Это действительно связано с тем, что обычно это более продвинутая тема C #, но код довольно шаблонный, и для человека со знанием C ++ это не должно вызывать проблем.

Для прямого вызова следуйте методам, описанным выше - т.е.ссылаться на dll в вашем проекте и создавать экземпляры с помощью кода согласно Одеду (который, к сожалению, удалил свой ответ, поэтому воспроизводит ниже)

DivisionClass.Division(1, 2)

РЕДАКТИРОВАТЬ

Если методыне статично

Вызов метода с помощью отражения

  Assembly myAssembly1 = Assembly.LoadFrom("myPath\\Assembly1.dll");     
  Type myType = myAssembly1.GetType("MyClass");      
  object myObject = Activator.CreateInstance(myType);     
  myType.Invoke("myMethodName", BindingFlags.InvokeMethod, null, myObject, null); 

В отдельном домене приложения возникает сложность - см. ссылка .

Также я не думаю, что ваш класс Отдела будет работать как есть.Для вызова через домены приложения вам нужно использовать некоторую сериализацию для ваших классов или наследовать класс от MarshalByRefObject - см. Этот SO вопрос .Учитывая, что это выглядит как доказательство концептуального типа вещей / базовой реализации вашего класса, тогда MarshalByRefObject будет для вас лучшим выбором - думаю, проще всего.Тем не менее, выполнение через домены приложений может стать затруднительным.

Вызов метода с помощью экземпляра в коде

DivisionClass divisor = new DivisionClass()
divisor.Division(1,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...