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

发布于 2024-12-22 18:17:16 字数 798 浏览 1 评论 0原文

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

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

开始看清了 2024-12-29 18:17:16

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

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

I figured it out by looking at the LINQPad App.config -- I needed to add the following to my own App.config:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>
溺深海 2024-12-29 18:17:16

尝试一下:

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
}

注意!名字是“秀”或“秀”???在你的代码上你可以用不同的方式写它!

try that :

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
}

Attention !! the name is "Show" ou "show" ??? on your code ou write it differently !

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文