2012-02-23 4 views
2

У меня есть DLL, написанная на C#. В этой DLL есть класс, который определен. Давайте предположим, что код этой DLL является:Как создать экземпляр класса, объявленного в C# 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 (долгота, длинная) не может быть доступна с экземпляром Справка; квалифицируйте его с помощью typename.

Спасибо всем

+1

вы имеете в виду вызов DivisionClass.Division (х, у), которая на самом деле не создание экземпляра DivisionClass, так как это статический метод? –

+1

Что вы пробовали? Обратите внимание, что вам не нужно создавать экземпляр, поскольку 'Division' является статическим методом. –

+0

вызывается непосредственно из вашей ссылки проекта for.eg 'unloadableDLL.DivisionClass.Division (100,10) '. Поскольку это статический метод, вам не нужно создавать экземпляр. – Turbot

ответ

2

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

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

DivisionClass.Division(1, 2) 

EDIT

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

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

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); 

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

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

Вызов метода с помощью instaniation в коде

DivisionClass divisor = new DivisionClass() 
divisor.Division(1,2) 
+0

Я допустил ошибку. Предположим, что метод «Дивизион» не является статичным. –

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