как запустить созданную в памяти DLL и извлечь из нее значение, используя C # и рефлексию - PullRequest
1 голос
/ 05 марта 2011

Я хочу создать простой обработчик сценариев, чтобы использовать его в непредвиденной ситуации в моей программе.

Я могу запустить EXE-файл в памяти, но не имею представления о том, как запуститьпамять DLL.вот мой движок (полученный от vsj.co.uk):

 CSharpCodeProvider prov = new CSharpCodeProvider();
            ICodeCompiler compiler = prov.CreateCompiler();
            CompilerParameters cp = new CompilerParameters();
            cp.GenerateExecutable = false;
            cp.GenerateInMemory = true;

            cp.ReferencedAssemblies.Add("system.dll");
            cp.ReferencedAssemblies.Add("system.xml.dll");
            cp.ReferencedAssemblies.Add("system.data.dll");
            cp.ReferencedAssemblies.Add("system.windows.forms.dll");

            CompilerResults cr;
            cr = compiler.CompileAssemblyFromSource(cp, File.ReadAllText(@"c:\test\sc2.csx"));

            Assembly a = cr.CompiledAssembly;
            try {
                object o = a.CreateInstance(
                    "CSharpScript");
                MethodInfo mi = a.EntryPoint;
                mi.Invoke(o, null);
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }

и вот моя простая DLL, которую я хочу получить из нее во время выполнения:

//sc2.csx
using System;
using System.Collections.Generic;
using System.Text;


namespace dynamic_scripting
{
    public class DynScripting
    {
        public static int executeScript(string script)
        {
            return 1;
        }
    }
}

1 Ответ

2 голосов
/ 05 марта 2011

Что-то вроде:

    Assembly a = cr.CompiledAssembly;
    try {
        Type type = a.GetType("dynamic_scripting.DynScripting");
        int result = (int) type.GetMethod("executeScript").Invoke(
            null, new object[] {"CSharpScript" });
    }
    catch(Exception ex) {
        MessageBox.Show(ex.Message);
    }

, в частности:

  • Это не совсем точка входаэто просто произвольный метод
  • , поскольку это статический метод, вам не нужно создавать экземпляр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...