No se puede llamar al método de un objeto JavaScript creado en el código inyectado en el documento de WebBrowser después de navegar

Encontré otras preguntas como esta, pero no exactamente, y con soluciones que no resuelven este problema en particular. Estoy trabajando en un proyecto que es algo así como iMacros para Internet Explorer. Este es mi código simplificado:

public partial class Form1 : Form
{
    public JSObject jsObject = new JSObject();
    int uniqueNameEnsurer = 0;

    public Form1()
    {
        InitializeComponent();
        webBrowser1.Navigate("www.google.com");
    }

    private void InvokeCode(string functionCode)
    {
        HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
        HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
        IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
        element.text = "function MyInjectedFunction" + uniqueNameEnsurer + "(Param){" + functionCode + "}";
        head.AppendChild(scriptEl);
        webBrowser1.Document.InvokeScript("MyInjectedFunction" + uniqueNameEnsurer, new object[] { jsObject });
        uniqueNameEnsurer++;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        InvokeCode(@"
            function MyObject()
            {
                this.Something = 'hello';
                this.SomeFunc = function(){
                    alert('in SomeFunc!!!');
                }
            }

            Param.UserData = new MyObject();
        ");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        webBrowser1.Navigate("www.bing.com");
    }

    private void button3_Click(object sender, EventArgs e)
    {
        InvokeCode(@"
            alert(Param.UserData.Something);
            Param.UserData.SomeFunc();
        ");
    }
}

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class JSObject
{
    public object UserData;
}

Entonces, lo que hago es hacer clic en el botón1 (que llama abutton1_Click), luego botón2 (que llama abutton2_Click), espere un segundo para cargar, y luego haga clic en el botón3 (que llama abutton3_Click). Cuando hago clic en el botón 3, recibo una alerta que dice "hola" (lo que significa que el objeto de alguna manera persiste después de navegar), pero justo después de eso, recibo un error que dice "No se puede ejecutar el código de un script liberado". Esto es probablemente algún tipo de cosa de seguridad. Encontré algunas publicaciones que hablan pero ninguna de ellas resuelve mi problema. Puedo solucionar el problema creando miSomeFunc como una cadena y luego usandoeval, pero esta es una solución desagradable. Si hay algo que pueda hacer con mi código C # que me permita mantener el código JavaScript tal como está (y funcionar, por supuesto), sería genial. Si no, ¿cuál sería la mejor solución para poder llamar aSomeFunc después de navegar?

Respuestas a la pregunta(2)

Su respuesta a la pregunta