在C#中创建GUI并在VBScript中调用

我尝试用C#制作一个带有COM-visible的ActiveX。 它是一个Windows窗体。 我成功地将其构建为dll ActiveX,然后我编写了一个VBScript代码来调用它。 从那之后出现但消失了。 我不知道为什么@@这是我的代码:

C#代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Reflection; namespace ActiveXTestLibrary { [ProgId("ActiveXTestLibrary.UserControl")] [ClassInterface(ClassInterfaceType.AutoDispatch)] [ComVisible(true)] public partial class UserControl1 : Form { public UserControl1() { InitializeComponent(); } [ComVisible(true)] public void Hello() { this.Show(); } private void radButton1_Click(object sender, EventArgs e) { this.lblResult.Text = "I am a .NET user control happily living \ninside an ActiveX container. Cheers."; } [ComRegisterFunction()] public static void RegisterClass(string key) { StringBuilder sb = new StringBuilder(key); sb.Replace(@"HKEY_CLASSES_ROOT\", ""); RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true); RegistryKey ctrl = k.CreateSubKey("Control"); ctrl.Close(); RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true); inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase); inprocServer32.Close(); k.Close(); } [ComUnregisterFunction()] public static void UnregisterClass(string key) { StringBuilder sb = new StringBuilder(key); sb.Replace(@"HKEY_CLASSES_ROOT\", ""); RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true); if (k == null) { return; } k.DeleteSubKey("Control", false); RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true); inprocServer32.DeleteSubKey("CodeBase", false); inprocServer32.Close(); } } } 

和VBScript:

 Sub main set objTest = CreateObject("ActiveXTestLibrary.UserControl") objTest.Hello end sub call main 

要显示表单,您需要通过调用Application.Run来启动消息循环:

 [ComVisible(true)] public void Hello() { Applicaiton.Run(this); } 

Show()函数将显示表单并立即退出。 在窗体关闭之前, Application.Run()不会退出。