我有一个注册类型,当前可以通过以下方式在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>

关于c# - LINQPad中的反射与实际有所不同,可能是由于安全性吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8641627/

10-13 04:31