Как зарегистрировать COM DLL, написанную на C #, с помощью Regsvr32? - PullRequest
12 голосов
/ 16 ноября 2010

У меня есть приложение 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, ничего не говорится о "точке входа DLLRegisterServer".

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

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

Ответы [ 2 ]

19 голосов
/ 16 ноября 2010

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

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

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

0 голосов
/ 10 июля 2014

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