2010-11-16 22 views
12

Tengo una aplicación VB6 que utiliza 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 C# sigue exactamente este formato: CodeProject C# COM Example¿Cómo registro una DLL COM escrita en C# con Regsvr32?

Al desplegar a otras máquinas, Regsvr32.exe me da el siguiente error al intentar 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 problemas MAYORES al usar RegAsm.exe en diferentes máquinas, por lo 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, máquinas x86, máquinas x64, etc.)

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

Respuesta

19

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

Puede hacerlo desde el IDE con Proyecto + Propiedades, pestaña Construir, Registrarse para la casilla 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: acaba 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.

+0

@Hans - 2 preguntas: ¿Cuáles son las 2 versiones para máquinas de 64 bits? ¿Hay alguna manera de crear, implementar y usar la DLL COM en VB6 sin registrarla? –

+0

La versión de 32 bits y la de 64 bits. Técnicamente sí con un manifiesto COM sin registro en la aplicación del cliente. Necesita ''. –

+0

@Mike Webb: Como está haciendo interoperabilidad COM con VB6, necesita 1. compilar el proyecto C# con un objetivo x86 y 2. usar regasm bajo c: \ windows \ syswow64. –

0

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

¿Qué pasa si un usuario tiene una versión diferente de .NET Framework? En mi caso, parece que tengo múltiples versiones y muchas no tienen RegAsm en absoluto. Solo v2.0.50727 y v4.0.30319 lo hace. –

Cuestiones relacionadas