Gre*_*g D 2 c# clickonce pinvoke code-access-security
我即将开始研究针对内部客户的ClickOnce应用程序,以便在组织的Intranet上使用.我想简化设置过程,所以我认为开发部分信任的应用程序是个好主意,但现在我不太确定.
用户特别要求的一件事是(归结为)a TextBox与Cue Text.目前提供此功能的最简单方法是使用一个简单的子类,TextBox其中包含CueText功能作为属性.cuetext功能是通过PInvoke'd调用完成的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);
}
}
Run Code Online (Sandbox Code Playgroud)
"啊哈!我需要SecurityPermission.UnmanagedCode." 默认的Intranet区域安全性包括SecurityPermission我可以告诉的权限,所以我尝试运行它,它会在调用时爆炸UpdateCueText().我甚至可以检查SecurityExceptionb/c 上的属性,每次尝试评估一个SecurityException属性都会引发另一个无法察觉的属性SecurityException.
我尝试标准修改:
protected override void OnHandleCreated(EventArgs e)
{
var permission = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
permission.Assert();
try
{
this.UpdateCue();
}
finally
{
CodeAccessPermission.RevertAssert();
}
base.OnHandleCreated(e);
}
Run Code Online (Sandbox Code Playgroud)
仍然没有运气.但是,当我转到项目属性中的安全设置页面并将SecurityPermission设置为"Included"而不是"Zone Default"时,我甚至不需要手动断言,一切都会发生.但当然,我认为客户仍然会得到提升提示.
是否有可能从部分信任环境中做我想做的事情? 我开始怀疑它不是b/c它甚至没有意义.任意部分受信任的代码不应该只能调用SendMessage,对吧?我开始意识到我一直试图规避安全措施而不是在其中工作.
如果是这种情况,是否值得努力开发这个以部分信任为优先级的应用程序?或者我应该在设置时将自己辞职至提升提示,以便为计划和满足ui要求创建完全受信任的应用程序?
如果您正在部署Intranet应用程序,我绝对不认为混淆部分信任方案是值得的.部分信任往往难以理解,并且可能会对代码施加非明显的限制.我只在必须将组件部署到现有的部分信任环境时才使用它.
在不需要它的场景中设置新的部分信任环境只会为自己增加额外的开销.除非有特定的客户要求,内联网应用程序的可能性较小,否则我会避免使用它.