Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向Regsvr32注册.NET COM DLL?_C#_Com_Vb6_Regsvr32 - Fatal编程技术网

C# 如何向Regsvr32注册.NET COM DLL?

C# 如何向Regsvr32注册.NET COM DLL?,c#,com,vb6,regsvr32,C#,Com,Vb6,Regsvr32,我有一个使用COM DLL的VB6应用程序。DLL是用C#编写的。在C#项目属性中,我选中了“注册COM互操作”选项。VB6应用程序在我的开发机器上运行良好。C#代码完全遵循以下格式: 在部署到其他计算机时,当我尝试注册DLL时,Regsvr32.exe会显示以下错误: The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found. 这是什么意思?我没有读过关于COM DLL的教程/文

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

在部署到其他计算机时,当我尝试注册DLL时,Regsvr32.exe会显示以下错误:

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?

你不能。托管[ComVisible]类库需要在Regasm.exe中注册

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


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

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

@Hans-2问题:64位机器的2个版本是什么?有没有一种方法可以在VB6中创建、部署和使用COM DLL而不注册它?32位和64位版本。技术上是的,客户端应用程序中有一个无注册表COM清单。它需要
@Mike Webb:当您使用VB6进行COM互操作时,您需要1。使用x86目标和2编译C#项目。在c:\windows\syswow64下使用regasm。否,regasm位于框架目录中。Framework64适用于64位版本,但对于vb6客户端,无需担心这一点。@Hans-所以我不需要为vb6客户端使用64位版本的Regasm?COM DLL也将只针对x86。如果用户有不同版本的.NET Framework,该怎么办?在我的例子中,我似乎有多个版本,而许多版本根本没有RegAsm。只有v2.0.50727和v4.0.30319有帮助。@ShameelMohamed可能会有所帮助