G
Guest
We're having problems with events from a Windows Forms Control embedded in a
web page not firing in javascript after installing sp1 of the .net 1.1
framework. I have de-installed SP1 and can confirm that the problem is
solved by reverting to the original 1.1 framework.
For some background on sinking events in IE script, read the following:
http://support.microsoft.com/default.aspx?scid=kb;en-us;316516
To demonstrate the problem, I have created a simple control with an event.
The assembly is strong named, and a code group/permission set for the strong
named assembly has been created with Security --> calls to unmamanged
assemblies enabled (needed to be able to fire events in JScript). The
SecurityPermissionFlag.UnmanagedCode is asserted before firing the event,
otherwise the standard permissions for the relevent zone are used which
disallow calls to unmanagaged code. Also note that the
AllowPartiallyTrustedCallers attribute has been set. In the original .NET
1.1 framework, clicking the button on the web page fires the event in the
control - the message is alerted in the JScript. In the SP1 framework, the
"EVENT NOT FOUND" message appears. After clicking outside the control, then
clicking on the control, the event will then subsequently fire correctly. We
attempted to simulate by calling the click() method on various objects but to
no avail.
Changing the permission set for the relevent zone to one that allows
unamanaged code solves the problem, but of course it leaves a gaping security
hole and is therefore not a viable solution.
Any suggestions for a solution or workaround would be most gratefully
received.
C# code from the control is below:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("mykeyfile.snk")]
[assembly: AllowPartiallyTrustedCallers()]
[assembly: AssemblyVersion("1.0.*")]
namespace MyControl
{
[GuidAttribute("2E3F0470-9499-4eaf-B0F2-6F6CDF9BF1DC")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ICOMEvents
{
[DispId(1)]
[SecurityPermissionAttribute(SecurityAction.Assert,
UnmanagedCode=true)]
void onSendMessage(string sSendMessage);
}
public interface IGridCOMIncoming
{
void setPermissions();
void checkEvent();
}
/// <summary>
/// Summary description for UserControl1.
/// </summary>
public delegate void SendMessage(string theMessage);
[ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ICOMEvents))]
[SecurityPermissionAttribute(SecurityAction.Assert, UnmanagedCode=true)]
public class SimpleControl :
System.Windows.Forms.UserControl,IGridCOMIncoming
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private SecurityPermission sp;
private event SendMessage m_sendMessage;
public event SendMessage onSendMessage
{
add
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
m_sendMessage += value;
}
remove
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
m_sendMessage -= value;
}
}
public void setPermissions()
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
}
public void checkEvent()
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
if ( m_sendMessage == null )
{
MessageBox.Show("EVENT NOT FOUND");
}
else
{
m_sendMessage("Event fired OK");
}
}
public SimpleControl()
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
// TODO: Add any initialization after the InitComponent call
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( 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.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(40, 64);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "Click Me";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// SimpleControl
//
this.Controls.Add(this.button1);
this.Name = "SimpleControl";
this.ResumeLayout(false);
}
#endregion
private void button1_Click(object sender, System.EventArgs e)
{
checkEvent();
}
}
}
HTML & JScript web page below:
<head>
<title></title>
</head>
<body>
<input type='button' onclick='SimpleControl.checkEvent();' value='Check
Event' ID="Button1" NAME="Button1">
<object id='SimpleControl'
classid='MyControl.SimpleControl.dll#MyControl.SimpleControl' height=100
width=100 VIEWASTEXT>
</object>
<script language='JScript'>
function SimpleControl:nSendMessage( sMessage )
{
alert(sMessage);
}
</script>
</body>
</html>
web page not firing in javascript after installing sp1 of the .net 1.1
framework. I have de-installed SP1 and can confirm that the problem is
solved by reverting to the original 1.1 framework.
For some background on sinking events in IE script, read the following:
http://support.microsoft.com/default.aspx?scid=kb;en-us;316516
To demonstrate the problem, I have created a simple control with an event.
The assembly is strong named, and a code group/permission set for the strong
named assembly has been created with Security --> calls to unmamanged
assemblies enabled (needed to be able to fire events in JScript). The
SecurityPermissionFlag.UnmanagedCode is asserted before firing the event,
otherwise the standard permissions for the relevent zone are used which
disallow calls to unmanagaged code. Also note that the
AllowPartiallyTrustedCallers attribute has been set. In the original .NET
1.1 framework, clicking the button on the web page fires the event in the
control - the message is alerted in the JScript. In the SP1 framework, the
"EVENT NOT FOUND" message appears. After clicking outside the control, then
clicking on the control, the event will then subsequently fire correctly. We
attempted to simulate by calling the click() method on various objects but to
no avail.
Changing the permission set for the relevent zone to one that allows
unamanaged code solves the problem, but of course it leaves a gaping security
hole and is therefore not a viable solution.
Any suggestions for a solution or workaround would be most gratefully
received.
C# code from the control is below:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("mykeyfile.snk")]
[assembly: AllowPartiallyTrustedCallers()]
[assembly: AssemblyVersion("1.0.*")]
namespace MyControl
{
[GuidAttribute("2E3F0470-9499-4eaf-B0F2-6F6CDF9BF1DC")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ICOMEvents
{
[DispId(1)]
[SecurityPermissionAttribute(SecurityAction.Assert,
UnmanagedCode=true)]
void onSendMessage(string sSendMessage);
}
public interface IGridCOMIncoming
{
void setPermissions();
void checkEvent();
}
/// <summary>
/// Summary description for UserControl1.
/// </summary>
public delegate void SendMessage(string theMessage);
[ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ICOMEvents))]
[SecurityPermissionAttribute(SecurityAction.Assert, UnmanagedCode=true)]
public class SimpleControl :
System.Windows.Forms.UserControl,IGridCOMIncoming
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private SecurityPermission sp;
private event SendMessage m_sendMessage;
public event SendMessage onSendMessage
{
add
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
m_sendMessage += value;
}
remove
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
m_sendMessage -= value;
}
}
public void setPermissions()
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
}
public void checkEvent()
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
if ( m_sendMessage == null )
{
MessageBox.Show("EVENT NOT FOUND");
}
else
{
m_sendMessage("Event fired OK");
}
}
public SimpleControl()
{
sp = new SecurityPermission(
SecurityPermissionFlag.UnmanagedCode );
sp.Assert();
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
// TODO: Add any initialization after the InitComponent call
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( 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.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(40, 64);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "Click Me";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// SimpleControl
//
this.Controls.Add(this.button1);
this.Name = "SimpleControl";
this.ResumeLayout(false);
}
#endregion
private void button1_Click(object sender, System.EventArgs e)
{
checkEvent();
}
}
}
HTML & JScript web page below:
<head>
<title></title>
</head>
<body>
<input type='button' onclick='SimpleControl.checkEvent();' value='Check
Event' ID="Button1" NAME="Button1">
<object id='SimpleControl'
classid='MyControl.SimpleControl.dll#MyControl.SimpleControl' height=100
width=100 VIEWASTEXT>
</object>
<script language='JScript'>
function SimpleControl:nSendMessage( sMessage )
{
alert(sMessage);
}
</script>
</body>
</html>