По сути, как только вы нашли MethodInfo
, который вы хотите на Type
, который вы создали из кода пользователя, не возникает проблем с простой отправкой ему объекта в качестве параметра.Как в:
object userType = ... // compile user's code, load user's type from compiled assembly
MethodInfo myMethod = ... // find the wanted method on the user's type
// assuming the user code is in a static method to avoid having to create instances.
myMethod.Invoke(null, targetObj);
Если вы хотите, чтобы пользователю нужно было только написать:
theObject.Color;
Затем вы должны обернуть код пользователя, чтобы получить что-то вроде этого:
// BEGIN PREFIX
public static class UserType
{
public static UserMethod(TheObject theObject);
{
// END PREFIX, user code follows
theObject.Color = Color.Red;
// BEGIN SUFFIX
}
}
// END SUFFIX
Кстати, у выбранной вами конструкции есть некоторые серьезные последствия для безопасности.
Например, ничто не может помешать пользовательскому коду выполнить действия, которые приведут к прекращению работы вашего приложения, перестанут отвечать на запросы,или другие вещи.Преднамеренно или нет.Например, если пользователь вводит что-то вроде System.Windows.Forms.Application.Exit();
, вы ничего не можете сделать.
Решением таких уязвимостей было бы запустить код пользователя в отдельном AppDomain
и отправить ему целевой объект, например, через Remoting
.
Редактировать: Попытка предложить способ, который не требует передачи объекта в качестве параметра.
Вы можете создать сборку с помощьюодин класс, который будет представлять статический экземпляр вашего объекта.Что-то вроде:
public class TheInstance
{
public static TheObject TheObject = new TheObject();
}
Так что теперь пользовательский код сможет делать такие вещи, как:
TheInstance.TheObject.Color = Color.Red;
И вам не придется беспокоиться об отправке параметра.
Чтобы пользовательский код мог получить доступ к классу в этой сборке, все, что вам нужно сделать, это указать эту сборку как справочную, когда вы используете ICodeCompiler
для компиляции кода пользователя.
Это то, что вы искали?