Подтвердить что ты не робот

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

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

При развертывании на другие компьютеры Regsvr32.exe дает мне следующую ошибку при попытке зарегистрировать DLL:

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

Что это значит? Нет учебников/документации. Я читал о COM-библиотеках, говорящих о "DLLRegisterServer начального уровня".

У нас были ОСНОВНЫЕ проблемы с использованием RegAsm.exe на разных компьютерах, поэтому нам действительно нужно решение, в котором мы можем запустить regsvr32.exe вместо этого, который будет работать для любой машины, на которой мы развертываем (например, XP, Vista, Windows 7, x86 машины, машины x64 и т.д.)

Что мне нужно добавить в мой код С#, чтобы сделать его зарегистрированным с помощью regsvr32.exe?

4b9b3361

Ответ 1

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

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

Изменить: просто увидел замечание "основные проблемы". Заметьте, что это такое, короче от /codebase. Вам нужно выбрать правильную версию на 64-битных машинах. Есть два. И вам потребуется повышенное командное приглашение, чтобы UAC не останавливал его.

Ответ 2

Вы можете создать простое приложение 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();
        }
    }
}