Выполнить метод другого пространства имен по динамическому коду в C # winforms - PullRequest
0 голосов
/ 21 декабря 2010

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

Я использую компилятор кода C # для выполнения динамических кодов.Компилятор C # читает файл кода и создает код в новом пространстве имен (полный новый код), компилирует и запускает его.С другой стороны, все эти базовые приложения хоста.

У меня есть несколько методов, которые присутствуют в хост-приложении, которые я хочу выполнить динамическим кодом.Есть ли способ, которым может быть выполнен метод другого пространства имен или приложения?

Ответы [ 3 ]

1 голос
/ 21 декабря 2010

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

Более подробно:

Скажем, у вас есть класс с именем MyClass, к которому вы хотите получить доступ из динамического кода. Поместите класс MyClass в отдельную сборку, назовем его MyAssembly. Когда вы компилируете динамический код, одно из свойств ICodeCompiler позволяет вам предоставлять сборки в качестве ссылок. Таким образом, вы должны предоставить typeof(MyClass).Assembly через это свойство.

Теперь, когда вы скомпилируете код, он сможет делать такие вещи, как:

MyClass.CallSomeMethod();

Пространства имен здесь не проблема. Вы можете убедиться, что динамический код использует полное имя типа (например, MyNameSpace.MyClass, или вы можете сгенерировать using MyNamespace; в начале динамического кода.

Наконец, я присоединяюсь к рекомендации Ричарда определить четкий интерфейс, который динамический код сможет использовать. Вам просто нужно предоставить сборку, содержащую этот интерфейс, в качестве ссылки при компиляции.

1 голос
/ 21 декабря 2010

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

Что-то вроде

public interface IMyApplication
{
      void DoSomethingInMyMainApp();
}
public interface IScriptKiddie
{
      void Init(IMyApplication app);
}

Тогда ваши скрипты l33tможно написать

public class MyScript : IScriptKiddie //< you could emit this yourself
{

     public void Init(IMyApplication app) //<could emit this yourself if scripter knows app keyword
     {
          app.DoSomethingInMyMainApp();
     }
}

, и в своем приложении вы можете предоставить конкретную реализацию IMyApplication для передачи в класс после компиляции, создания класса и передачи в метод Init.

0 голосов
/ 21 декабря 2010

Вы можете использовать отражение. Примерно так:

Type objType = null;
objType = _Assemblies.GetType(className);
MethodInfo methodInfo = null;
methodInfo = objType.GetMethod(TheCommandString);
methodInfo.Invoke(objType, userParameters); 
...