2010-08-31 52 views
1

我想在C#中托管一个Windows窗体控件在HTML页面内,然后在IIS中托管该网页以便其他客户机可访问。 问题是:用户控件使用一些非托管代码,当使用另一台机器访问时触发SecurityPermissionException如何授予托管在HTML中的窗体窗体的非托管代码访问?

我已经设法将我的代码贬低为一个基本的例子,以查明错误,我似乎无法找到答案。

这里是我的用户控件:

// To handle strong named assembly 
[assembly: AllowPartiallyTrustedCallers] 

namespace WinFormsHTMLControl 
{ 
    [SecurityPermissionAttribute(SecurityAction.Assert, UnmanagedCode = true)] // to allow assertions regarding unmanaged code permissions 
    public partial class HelloWorldControl : UserControl 
    { 
     #region Methods/Consts for Embedding a Window 

     [DllImport("user32.dll", SetLastError = true)] 
     private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

     #endregion 

     public HelloWorldControl() 
     { 
      InitializeComponent(); 
     } 

     private void btnClick_Click(object sender, EventArgs e) 
     { 
      new SecurityPermission(PermissionState.Unrestricted).Assert(); 

      IntPtr picBoxHandle = FindWindow("IEFrame", "Internet Explorer"); 
      lblMessage.Text = picBoxHandle.ToString(); 

      SecurityPermission.RevertAssert();      
     } 
    } 
} 

我已经签署了一个关键的组件,我创建了一个权限集在.NET配置工具,以授予接取非托管代码,并创建了一个CodeGroup指向用于命名组件的强键。 我也创建了一个MSI为了将这些设置复制到其他机器(我在企业和机器级别都做了这个)。

尽管如此,这段代码还在这里触发SecurityPermissionException当我按一下按钮......

我缺少的东西?

回答

2

IE被沙箱化,你正试图执行一个你不能执行的操作 - 即直接从网站调用user32。想象一下,如果有人能够在任何网站上做到这一点,互联网将会有多危险。你的核心架构是有缺陷的。

+0

我明白你在说什么,但这是以前做过的事情,也是使用在网站上托管的Windows窗体的动机之一:做一些无法仅使用网页完成的事情。 关于安全问题,这正是为什么要让这个工作很困难,因为你说了什么。然而,它可以完成,而不是一个有缺陷的架构,它只取决于你正在使用的环境。总结,我知道它可以完成,我只是不能复制它。尽管如此,谢谢你的回答。 – 2010-08-31 13:21:16