Как вызвать управляемый файл DLL в C #? - PullRequest
2 голосов
/ 26 июля 2011

Я делаю скриптовый язык, но у меня серьезная проблема.

Мне нужно сделать так, чтобы вы могли вызывать .NET DLL на языке, но я не нашел способа сделать это в C #

Кто-нибудь знает, как я могу загрузить и вызвать .NET DLL программно?(Я не могу просто добавить ссылку, поэтому не говорите это)

Ответы [ 3 ]

4 голосов
/ 26 июля 2011

Вот как я это сделал:

Assembly assembly = Assembly.LoadFrom(assemblyName);
System.Type type = assembly.GetType(typeName);
Object o = Activator.CreateInstance(type);
IYourType yourObj = (o as IYourType);

, где assemblyName и typeName - строки, например:

string assemblyName = @"C:\foo\yourDLL.dll";
string typeName = "YourCompany.YourProject.YourClass";//a fully qualified type name

, тогда вы можете вызывать методы на вашем объекте:

yourObj.DoSomething(someParameter);

Конечно, какие методы вы можете вызывать, определяется вашим интерфейсом IYourType ...

2 голосов
/ 26 июля 2011

Вы можете использовать Assembly.LoadFrom , оттуда используйте стандартное отражение , чтобы получить типы и методы (я предполагаю, что вы уже делаете это в своих скриптах). Пример на странице MSDN (связанный) показывает это:

Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
// Obtain a reference to a method known to exist in assembly.
MethodInfo Method = SampleAssembly.GetTypes()[0].GetMethod("Method1");
// Obtain a reference to the parameters collection of the MethodInfo instance.
ParameterInfo[] Params = Method.GetParameters();
// Display information about method parameters.
// Param = sParam1
//   Type = System.String
//   Position = 0
//   Optional=False
foreach (ParameterInfo Param in Params)
{
    Console.WriteLine("Param=" + Param.Name.ToString());
    Console.WriteLine("  Type=" + Param.ParameterType.ToString());
    Console.WriteLine("  Position=" + Param.Position.ToString());
    Console.WriteLine("  Optional=" + Param.IsOptional.ToString());
}
1 голос
/ 26 июля 2011

Похоже, вам нужно использовать одну из перегрузок Assembly.Load ( Assembly.Load на MSDN ).После того, как вы динамически загрузили свою сборку, вы можете использовать System.Reflection, динамические объекты и / или интерфейсы / базовые классы для доступа к типам внутри нее.

...