Как зарегистрировать 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?
Ответы
Ответ 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();
}
}
}