如何使用Regsvr32注册.NET COM DLL?

15
我有一个使用COM DLL的VB6应用程序,该DLL是用C#编写的。在C#项目属性中,我已经勾选了“Register for COM interop”选项。VB6应用程序在我的开发机器上运行良好。C#代码完全遵循以下格式: CodeProject C# COM Example 当部署到其他机器时,当我尝试注册DLL时,Regsvr32.exe会给我以下错误:
“The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found.”
这是什么意思?我读过关于COM DLL的所有教程/文档,都没有提及“entry-point DLLRegisterServer”。
我们在不同的机器上使用RegAsm.exe遇到了严重问题,因此我们真的需要一种解决方案,可以运行regsvr32.exe,并且适用于我们部署到的任何机器(即XP、Vista、Windows 7、x86机器、x64机器等)。
我需要添加什么内容到我的C#代码中,以使其能够与regsvr32.exe一起注册?
2个回答

23

你不能这样做。被管理的[ComVisible]类库需要使用Regasm.exe进行注册。

你可以在IDE中通过 [项目属性] --> [生成] 选项卡中选择 [为COM互操作注册] 复选框实现注册。如果你运行Regasm.exe,通常需要使用 /codebase 命令行选项,这样你就不必将程序集放入GAC中。另一个选项是让Regasm.exe使用 /regfile 选项生成.reg文件, 然后在目标机器上运行它以更新注册表。

编辑:刚看到“主要问题”说明。除了/codebase之外,我不确定还有什么。64位机器上需要选择正确的版本。同时,你需要使用提升的命令提示符,这样UAC才不会阻止它。


@Hans - 2个问题:64位机器的两个版本是什么?是否有一种方法可以在VB6中创建、部署和使用COM DLL而无需注册它? - Mike Webb
32位和64位版本。从技术上讲,在客户端应用程序中使用无需注册表的COM清单是可以的。它需要<clrClass> - Hans Passant
@Mike Webb:由于您正在使用VB6进行COM互操作,因此需要执行以下两个步骤:1. 使用x86目标编译C#项目;2. 在c:\windows\syswow64下使用regasm。 - Dirk Vollmar
不,regasm在框架目录中。Framework64用于64位版本,但对于vb6客户端不需要担心这个。 - Hans Passant
@Hans - 那么我不需要为VB6客户端使用64位版本的Regasm吗?COM DLL也只会针对x86。 - Mike Webb
没错,没有64位的vb6版本可以使用它。你不必针对x86。Regasm的版本锁定了位数。 - Hans Passant

0

你可以制作一个简单的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();
        }
    }
}

1
如果用户有不同版本的.NET Framework怎么办?在我的情况下,我似乎有多个版本,而且很多版本根本没有RegAsm。只有v2.0.50727和v4.0.30319有。 - Shameel Mohamed
@ShameelMohamed 可能会帮到你,它可以找到机器上的 regasm 位置。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接