代码之家  ›  专栏  ›  技术社区  ›  Mike Webb

如何用Regsvr32注册用C#编写的COM DLL?

  •  12
  • Mike Webb  · 技术社区  · 15 年前

    我有一个使用COM动态链接库的VB6应用程序。DLL是用C#编写的。在C#项目属性中,我选中了“注册COM互操作”选项。VB6应用程序在我的开发机器上运行良好。C代码完全遵循以下格式: CodeProject C# COM Example

    在部署到其他计算机时,Regsvr32.exe在尝试注册DLL时给出以下错误:

    The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found.
    

    这是什么意思?我读过的关于COM dll的教程/文档中没有提到“入口点DLLRegisterServer”。

    我们在不同的计算机上使用RegAsm.exe时遇到了主要问题,因此我们确实需要一个解决方案,在该解决方案中,我们可以运行regsvr32.exe,而该解决方案将适用于我们部署到的任何计算机(即XP、Vista、Windows 7、x86计算机、x64计算机等)

    我需要在我的C#代码中添加什么,以使它可以用regsvr32.exe注册?

    2 回复  |  直到 15 年前
        1
  •  20
  •   Hans Passant    15 年前

    不能。托管的[ComVisible]类库需要注册到Regasm.exe。

    您可以在IDE中使用Project+Properties、Build选项卡、Register for COM interop复选框执行此操作。如果运行Regasm.exe,通常需要/codebase命令行选项,这样就不必将程序集放入GAC中。另一个选项是让Regasm.exe使用/reg file选项生成一个.reg文件。你只需在目标机器上运行它来更新注册表。

    编辑:刚刚看到“重大问题”的评论。注意它们是什么,短于/codebase。您必须在64位计算机上选择正确的版本。有两个。您需要一个提升的命令提示符,这样UAC就不会停止它。

        2
  •  0
  •   Jamal Tom_B    11 年前

    您可以制作一个简单的Windows应用程序,并使用下面的代码注册COM DLL。请确保添加要以管理员身份运行的清单文件:

    ...
    
    namespace comregister
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            string framework = Environment.GetEnvironmentVariable("SystemRoot") + @"\Microsoft.NET\Framework\v2.0.50727\";
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox1.Text = openFileDialog1.FileName;
                    button2.Enabled = true;
                    button3.Enabled = true;
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                FileInfo fi = new FileInfo(textBox1.Text);
                string fn = fi.FullName.Substring(0, fi.FullName.Length - 4);
                string dll = "\"" + fi.FullName + "\"";
                string tlb = "\"" + fn + ".tlb\"";
    
                Process p = new Process();
                p.StartInfo.FileName = framework + "regasm.exe";
                p.StartInfo.Arguments = dll + " /tlb:" + tlb + " /codebase";
                p.Start();
                p.WaitForExit();
                label2.Text = "registered";
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                FileInfo fi = new FileInfo(textBox1.Text);
                string dll = "\"" + fi.FullName + "\"";
    
                Process p = new Process();
                p.StartInfo.FileName = framework + "regasm.exe";
                p.StartInfo.Arguments = dll + " /unregister";
                p.Start();
                p.WaitForExit();
                label2.Text = "unregistered";
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }
        }
    }