LINQPad中的反射与实际不同,可能是由于安全原因



我有一个注册的类型,目前通过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中运行我的代码和运行我的实际程序会给出不同的结果?

我通过查看LINQPad App.config找到了答案——我需要将以下内容添加到我自己的App.config中:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>

试一试:

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
}

注意! !名字是"秀"你的"秀"??

相关内容

  • 没有找到相关文章

最新更新