我即将开始开发针对内部客户的 ClickOnce 应用程序,以便在组织的 Intranet 上使用。我想简化设置过程,所以我认为开发部分信任的应用程序是个好主意,但现在我不太确定。
用户特别要求的一件事是(归结为)a TextBox
with 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()
. 我什至可以检查SecurityException
b/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,对吗?我开始意识到我一直在试图规避安全措施,而不是在其中工作。
如果是这样的话,是否值得以部分信任为优先来开发这个应用程序?或者我应该让自己在设置时接受提升提示以创建一个完全受信任的应用程序,以便安排时间并满足用户界面要求?