C # Использование Assembly для вызова метода в DLL - PullRequest
4 голосов
/ 31 июля 2011

Я много читал об этом - мне кажется, я очень близок к ответу. Я просто хочу вызвать метод из файла DLL, который я создал.

Например, для целей:

Мой файл DLL:

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

namespace ExampleDLL
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Windows.Forms.MessageBox.Show(args[0]);
        }

        public void myVoid(string foo)
        {
            System.Windows.Forms.MessageBox.Show(foo);
        }
    }
}


Мое заявление:

string filename = @"C:\Test.dll";
    Assembly SampleAssembly;
    SampleAssembly = Assembly.LoadFrom(filename);
    // Obtain a reference to a method known to exist in assembly.
    MethodInfo Method = SampleAssembly.GetTypes()[0].GetMethod("myVoid");
    // Obtain a reference to the parameters collection of the MethodInfo instance.

Все кредиты отправляются SO-пользователю 'woohoo' за указанный фрагмент Как вызвать управляемый файл DLL в C #?

Теперь, однако, я хотел бы иметь возможность не только ссылаться на мой Dll (и методы внутри него), но и правильно вызывать методы внутри него (в этом случае я хотел бы вызвать метод myVoid).

Может у кого-нибудь есть какие-нибудь предложения для меня?

Спасибо,

Evan

Ответы [ 4 ]

6 голосов
/ 31 июля 2011

Вопрос и ответ, на который вы ссылаетесь, использует рефлексию для вызова метода в управляемой DLL. Это не обязательно, если, как вы говорите, вы хотите сделать, вы просто ссылаетесь на свою DLL. Добавьте ссылку (с помощью параметра «Добавить ссылку» в Visual Studio), и вы можете вызвать свой метод напрямую следующим образом:

ExampleDLL.Program p = new ExampleDLL.Program(); // get an instance of `Program`
p.myVoid(); // call the method `myVoid`

Если вы хотите пройти маршрут отражения (как указано в woohoo), вам все еще нужен экземпляр вашего Program класса.

Assembly SampleAssembly = Assembly.LoadFrom(filename);
Type myType = SampleAssembly.GetTypes()[0];
MethodInfo Method = myType.GetMethod("myVoid");
object myInstance = Activator.CreateInstance(myType);
Method.Invoke(myInstance, null);

Теперь у вас есть экземпляр Program и вы можете позвонить myVoid.

2 голосов
/ 31 июля 2011
//Assembly1.dll
using System;
using System.Reflection;

namespace TestAssembly
{
    public class Main
    {
        public void Run(string parameters)
        {
            // Do something... 
        }
        public void TestNoParameters()
        {
            // Do something... 
        }
    }
}

//Executing Assembly.exe
public class TestReflection
{
    public void Test(string methodName)
    {
        Assembly assembly = Assembly.LoadFile("...Assembly1.dll");
        Type type = assembly.GetType("TestAssembly.Main");
        if (type != null)
        {
            MethodInfo methodInfo = type.GetMethod(methodName);
            if (methodInfo != null)
            {
                object result = null;
                ParameterInfo[] parameters = methodInfo.GetParameters();
                object classInstance = Activator.CreateInstance(type, null);
                if (parameters.Length == 0)
                {
                    result = methodInfo.Invoke(classInstance, null);
                }
                else
                {
                    object[] parametersArray = new object[] { "Hello" };

                    result = methodInfo.Invoke(classInstance, parametersArray);
                }
            }
        }
    }
}
0 голосов
/ 31 июля 2011

MethodInfo имеет метод, называемый Invoke.Поэтому просто вызовите Method.Invoke() с объектом, который вы создали, например, вызвав System.Activator.CreateInstance()

0 голосов
/ 31 июля 2011

Просто добавьте эту строку кода после получения ссылки на ваш метод.

            Method.Invoke(classInstance, new object[] {});

Надеюсь, эта помощь.

...