Отражение в LINQPad отличается от реального, может быть, из-за безопасности? - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть зарегистрированный тип, который в данный момент доступен в VB-коде через:

Dim prog As Object = CreateObject(sPath)
prog.Show(parameters)

Я переписал это в C # как:

var progType = Type.GetTypeFromProgID(path);
progInstance = Activator.CreateInstance(progType);
progType.InvokeMember("Show", BindingFlags.InvokeMethod, null, progInstance, new object[] {parameters});

По какой-то причине, когда я пытаюсь выполнить метод Show, он выглядит так, как будто его не существует. Следующий код в LINQPad показывает метод, однако в моем приложении ничего не дает:

var methods = progType.GetMethods().Where(m => m.Name.ToLower() == "show");

Я полагаю, что это связано с этой строкой из MSDN:

Требуется полное доверие для непосредственного абонента. Этот элемент не может использоваться частично доверенным или прозрачным кодом.

Я попытался добавить атрибут SecurityCritical в свой метод, но ничего не изменилось. Я не очень знаком с безопасностью .NET, может кто-нибудь объяснить, что означает строка из MSDN, и, возможно, почему запуск моего кода в LINQPad и запуск моей настоящей программы дают разные результаты?

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Я понял это, посмотрев на LINQPad App.config - мне нужно было добавить следующее в свой собственный App.config:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>
0 голосов
/ 27 декабря 2011

попробуйте это:

Type  _progType = Type.GetTypeFromProgID(path);
System.Reflection.MethodInfo _MethodInfo = typeof(_progType).GetMethod("Show");
if (!ReferenceEquals(_MethodInfo, null))
{
// method is founded
}
else
{
// method is not founded
}

Внимание !! имя "Показать" или "показать" ??? в своем коде ты пишешь по другому!

...