Artigo: 911721 - Última revisão: segunda-feira, 13 de Março de 2006 - Revisão: 1.1

Não poderá aceder à propriedade pública em tempo de execução e poderá receber uma mensagem de erro numa aplicação baseada no ASP.NET 2.0

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Considere o seguinte cenário. Numa aplicação baseada no Microsoft ASP.NET 2.0, a página Web contém um objecto de controlo de utilizador do Microsoft Windows Forms. Utilizar o JavaScript para tentar aceder às propriedades deste objecto de controlo de utilizador do Windows Forms. Neste cenário, não poderá aceder a propriedade pública em tempo de execução. Além disso, poderá receber a seguinte mensagem de excepção:
Consulte o fim desta mensagem, em vez desta caixa de diálogo, para obter detalhes sobre invocar a depuração do just-in-time (JIT).
Texto de excepção ************** **************
System.Security.SecurityException: Pedido da permissão do tipo ' System.Security.Permissions.SecurityPermission, mscorlib, versão = 2.0.0.0, idioma neutro, PublicKeyToken = = b77a5c561934e089 ' falhou. at System.Windows.Forms.SafeNativeMethods.IFont.GetHFont() at System.Windows.Forms.Control.ActiveXImpl.get_AmbientFont() at System.Windows.Forms.Control.get_Font() at System.Windows.Forms.Control.GetParentFont() at System.Windows.Forms.Control.get_Font() at System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.CommonLayout() at System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintWorker(PaintEventArgs e, Boolean up, CheckState state) at System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintUp(PaintEventArgs e, CheckState state) at System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintOver(PaintEventArgs e, CheckState state) at System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.Paint(PaintEventArgs pevent) at System.Windows.Forms.ButtonBase.OnPaint(PaintEventArgs pevent) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
A acção que falhou foi:
Pedido
O tipo da primeira permissão que falhou foi: System.Security.Permissions.SecurityPermission
Assemblagens ************** carregado **************
mscorlib
Versão da assemblagem: 2.0.0.0
Versão do Win32: 2.0.50215.44 (beta2.050215-4400)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50215/mscorlib.dll
----------------------------------------
Sistema
Versão da assemblagem: 2.0.0.0
Versão do Win32: 2.0.50215.44 (beta2.050215-4400)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
SmartClient
Versão da assemblagem: 1.0.1928.26893
Versão de Win32: n/a
CodeBase: http://localhost:1156/SmartClientTestWeb/SmartClient.dll
----------------------------------------
System.Windows.Forms
Versão da assemblagem: 2.0.0.0
Versão do Win32: 2.0.50215.44 (beta2.050215-4400)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Versão da assemblagem: 2.0.0.0
Versão do Win32: 2.0.50215.44 (beta2.050215-4400)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Microsoft.Mshtml
Versão da assemblagem: 7.0.3300.0
Versão de Win32: 7.0.3300.0
CodeBase: file:///C:/WINDOWS/assembly/GAC/Microsoft.mshtml/7.0.3300.0__b03f5f7f11d50a3a/Microsoft.mshtml.dll
----------------------------------------
Depuração JIT ************** **************
Para activar a depuração do just-in-time (JIT), o ficheiro .config para esta aplicação ou computador (machine.config) tem de ter o valor jitDebugging definido na secção system.windows.forms. A aplicação também deve ser compilada com depuração activada.
Por exemplo:
<configuration> < system.windows.forms jitDebugging = "true" / > </configuration>
Quando a depuração JIT está activada, qualquer excepção não processada será enviada para o depurador JIT registado no computador e não ser processada por esta caixa de diálogo.
Nota Este problema não ocorre no Microsoft .NET Framework 1.1.

Causa

Este problema ocorre porque a classe base UserControl contém o seguinte atributo.
ComVisible(false)

Como contornar

Para contornar este problema, adicione o seguinte atributo à classe UserControl .
ComVisible(true)

Mais Informação

Passos para reproduzir o problema

  1. Inicie o Microsoft Visual Studio 2005.
  2. No menu ficheiro , clique em novo Web Site .
  3. Na lista modelos , clique em ASP.NET Web Site .
  4. Na caixa localização , escreva DriveLetter:\Path\KB911721.
  5. Na lista idioma , clique em Visual C# e, em seguida, clique em OK .
  6. No Solution Explorer, clique com o botão direito do rato em default.aspx e, em seguida, clique em Abrir .
  7. Substitua o código existente com o seguinte código.
    <%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
        <script language=javascript>
            function TestData()
            {
                alert('Test1');
                form1.TestControl.TestProperty = "gomusin";
                alert(form1.TestControl.TestProperty);
            }
            
            function TestData1()
            {
                alert('Test2');
                var sData = form1.TestControl.TestProperty;
                alert(sData);
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <object id="TestControl" classid="SmartClient.dll#SmartClient.UserControl1" VIEWASTEXT>
            </object>
            <input id="Button2" type="button" value="Property Read" style="width: 165px" onclick="javascript:TestData1()" />
            <input id="Button1" type="button" value="Property Write" style="width: 168px" onclick="javascript:TestData()"/>
    </div>
        </form>
    </body>
    </html>
  8. No menu ficheiro , clique em Adicionar e, em seguida, clique em Novo projecto .
  9. Na lista modelos , clique em controlo do Windows biblioteca .
  10. Na caixa nome , escreva SmartClient.
  11. Na caixa localização , escreva DriveLetter:\Path e, em seguida, clique em OK .
  12. No estruturador de código para o ficheiro UserControl1.Designer.cs, substitua o código existente com o seguinte código. espaço de nomes
    namespace SmartClient
    {
        partial class UserControl1
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Component Designer generated code
    
            /// <summary>
            /// Required method for designer support - do not modify 
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.button2 = new System.Windows.Forms.Button();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.SuspendLayout();
                // 
                // button1
                // 
                this.button1.Location = new System.Drawing.Point(7, 90);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(126, 23);
                this.button1.TabIndex = 0;
                this.button1.Text = "property Read";
                this.button1.Click += new System.EventHandler(button1_Click);
                // 
                // button2
                // 
                this.button2.Location = new System.Drawing.Point(146, 90);
                this.button2.Name = "button2";
                this.button2.Size = new System.Drawing.Size(127, 23);
                this.button2.TabIndex = 1;
                this.button2.Text = "property Write";
                this.button2.Click += new System.EventHandler(button2_Click);
                // 
                // textBox1
                // 
                this.textBox1.Location = new System.Drawing.Point(22, 25);
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(232, 21);
                this.textBox1.TabIndex = 2;
                // 
                // UserControl1
                // 
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.button2);
                this.Controls.Add(this.button1);
                this.Name = "UserControl1";
                this.Size = new System.Drawing.Size(276, 123);
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
    
            #endregion
    
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.Button button2;
            private System.Windows.Forms.TextBox textBox1;
        }
    }
  13. No Solution Explorer, clique com o botão direito do rato UserControl1.cs e, em seguida, clique em Código .
  14. Substitua o seguinte código o código da aplicação existente.
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    
    namespace SmartClient
    {
      public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
        }
    
        String TestProperty = "something";
    
        void button2_Click(object sender, System.EventArgs e)
        {
          textBox1.Text = TestProperty;
        }
    
        void button1_Click(object sender, System.EventArgs e)
        {
          TestProperty = textBox1.Text;
        }
      }
    }
  15. No menu Debug , clique em Iniciar a depuração .

    Nota Depois de clicar em qualquer botão, repare o problema mencionado na secção "Sintomas".
Os produtos de outros fabricantes explicado neste artigo são fabricados por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, expressa ou implícita, relativamente ao desempenho ou fiabilidade destes produtos.

A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 2.0
Palavras-chave: 
kbmt kbtshoot kbprb KB911721 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 911721  (http://support.microsoft.com/kb/911721/en-us/ )
Retired KB ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.