Как зарегистрировать COM DLL, написанную на C#, с помощью Regsvr32?

У меня есть приложение VB6, которое использует COM DLL. Библиотека DLL написана на языке C#. В свойствах проекта C# у меня есть опция "регистрация для COM-взаимодействия". Приложение VB6 отлично работает на моей машине разработки. Код C# точно следует этому формату:пример CodeProject C# COM

при развертывании на других машинах 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 ответов


ты не можешь. Управляемые библиотеки классов [ComVisible] должны быть зарегистрированы в Regasm.исполняемый.

вы можете сделать это из IDE с помощью Project + Properties, вкладки Build, флажка Register for COM interop. Если вы запустите Regasm.exe обычно требуется параметр командной строки /codebase, поэтому вам не нужно помещать сборку в GAC. Еще один вариант-пусть Regasm.exe генерировать .файл reg с параметром / regfile. Вы просто запустите это на целевой машине, чтобы получить реестр усовершенствованный.

Edit: просто увидел замечание "основные проблемы". Обратите внимание, что они короткие из / 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();
        }
    }
}