¿Cómo registro un COM DLL escrito en C # con Regsvr32?

Tengo una aplicación VB6 que usa una DLL COM. La DLL está escrita en C #. En las propiedades del proyecto C # tengo marcada la opción “Registrar para la interoperabilidad COM”. La aplicación VB6 funciona bien en mi máquina de desarrollo. El código de C # sigue exactamente este formato: CodeProject C # COM Example

Al implementar en otras máquinas, Regsvr32.exe me da el siguiente error cuando bash registrar la DLL:

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

¿Qué significa esto? No hay tutoriales / documentación que he leído sobre las DLL COM dicen algo acerca de “entry-point DLLRegisterServer”.

Hemos tenido GRANDES problemas al usar RegAsm.exe en diferentes máquinas, así que realmente necesitamos una solución donde podamos ejecutar regsvr32.exe que funcionará para cualquier máquina en la que implementemos (es decir, XP, Vista, Windows 7, x86, x64 máquinas, etc.)

¿Qué debo agregar a mi código C # para que se pueda registrar con regsvr32.exe?

No puedes. Las bibliotecas de clases gestionadas [ComVisible] deben registrarse con Regasm.exe.

Puede hacerlo desde el IDE con Proyecto + Propiedades, ficha Construir, Registrar para la checkbox de interoperabilidad COM. Si ejecuta Regasm.exe, generalmente desea la opción de línea de comando / codebase para que no tenga que colocar el ensamblado en el GAC. Otra opción más es permitir que Regasm.exe genere un archivo .reg con la opción / regfile. Simplemente ejecutaría eso en la máquina de destino para actualizar el registro.

Editar: acabo de ver el comentario de “principales problemas”. Tenga en cuenta de qué se trata, corto de / codebase. Tienes que elegir la versión correcta en máquinas de 64 bits. Hay dos. Y necesita un símbolo del sistema elevado para que el UAC no lo detenga.

Puede hacer una aplicación simple de Windows y usar el siguiente código para registrar COM DLL. Asegúrese de agregar el archivo de manifiesto para ejecutar como administrador:

 ... 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(); } } }