2

我即将开始开发针对内部客户的 ClickOnce 应用程序,以便在组织的 Intranet 上使用。我想简化设置过程,所以我认为开发部分信任的应用程序是个好主意,但现在我不太确定。

用户特别要求的一件事是(归结为)a TextBoxwith Cue Text。目前提供此功能的最简单方法是使用TextBox包含 CueText 功能作为属性的简单子类。cuetext 功能是通过 PInvoke 调用来完成的SendMessage()

protected override void OnHandleCreated(EventArgs e)
{
    this.UpdateCueText();  // Bang, you're dead here
    base.OnHandleCreated(e);
}

private void UpdateCueText()
{
    if (this.IsHandleCreated)
    {
        NativeMethods.SendMessage(new HandleRef(this, this.Handle), setCueBannerMessage, this.showCueTextWithFocus ? new IntPtr(1) : IntPtr.Zero, this.cueText);
    }
}

“啊哈!我需要SecurityPermission.UnmanagedCode。” 据我所知,默认的 Intranet 区域安全包括SecurityPermission权限,所以我尝试运行它,它在调用UpdateCueText(). 我什至可以检查SecurityExceptionb/c 上的属性,每次尝试评估SecurityException属性都会引发另一个 uninspectable SecurityException

我尝试标准修改:

protected override void OnHandleCreated(EventArgs e)
{
    var permission = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
    permission.Assert();
    try
    {
        this.UpdateCue();
    }
    finally
    {
        CodeAccessPermission.RevertAssert();
    }
    base.OnHandleCreated(e);
}

仍然没有运气。但是当我进入项目属性中的安全设置页面并将SecurityPermission设置为“Included”而不是“Zone Default”时,我什至不需要手动断言,一切都会发生。但是,当然,我假设客户仍然会收到海拔提示。

是否可以在部分信任环境中做我想做的事情? 我开始怀疑这不是 b/c 它甚至没有意义。任意部分受信任的代码不应该只调用 SendMessage,对吗?我开始意识到我一直在试图规避安全措施,而不是在其中工作。

如果是这样的话,是否值得以部分信任为优先来开发这个应用程序或者我应该让自己在设置时接受提升提示以创建一个完全受信任的应用程序,以便安排时间并满足用户界面要求?

4

2 回答 2

5

如果您正在部署 Intranet 应用程序,我绝对不认为将部分信任场景弄乱是值得的。部分信任往往难以理解,并且可能对您的代码施加不明显的限制。我只在必须将组件部署到现有的部分信任环境中时才使用它。

在不需要它的场景中设置新的部分信任环境只会为您自己增加额外的开销。除非有特定的客户要求,对于 Intranet 应用程序不太可能,否则我会避免它。

于 2009-10-02T17:44:43.250 回答
1

该声明

permission.Assert();

只能授予程序集已经可用的线程权限。这就是为什么那行不通。

所以:是的,您需要在程序集级别包含这些权限。就像 JaredPar 所说,你不妨使用完全信任。

于 2009-10-02T18:08:56.403 回答