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 中运行我的代码和运行我的实际程序会产生不同的结果?
I have a registered type which is currently access in VB code via:
Dim prog As Object = CreateObject(sPath)
prog.Show(parameters)
I've rewritten this into C# as:
var progType = Type.GetTypeFromProgID(path);
progInstance = Activator.CreateInstance(progType);
progType.InvokeMember("Show", BindingFlags.InvokeMethod, null, progInstance, new object[] {parameters});
For some reason though, when I try to execute the Show method, it appears as if it does not exist. The following code in LINQPad shows the method however in my application results in nothing:
var methods = progType.GetMethods().Where(m => m.Name.ToLower() == "show");
I believe it has to do with this line from MSDN:
Requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.
I have tried adding the SecurityCritical
attribute to my method but nothing has changed. I'm not very familiar with .NET security, can someone explain what the line from MSDN means, and maybe why running my code in LINQPad and running my actual program give different results?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我通过查看 LINQPad App.config 找到了答案——我需要将以下内容添加到我自己的 App.config 中:
I figured it out by looking at the LINQPad App.config -- I needed to add the following to my own App.config:
尝试一下:
注意!名字是“秀”或“秀”???在你的代码上你可以用不同的方式写它!
try that :
Attention !! the name is "Show" ou "show" ??? on your code ou write it differently !