2010-11-16 73 views
12

Ho un'applicazione VB6 che utilizza una DLL COM. La DLL è scritta in C#. Nelle proprietà del progetto C# ho selezionato l'opzione "Registra per interoperabilità COM". L'app VB6 funziona perfettamente sul mio computer di sviluppo. Il codice C# segue questo formato esattamente: CodeProject C# COM ExampleCome registrare una DLL COM scritta in C# con Regsvr32?

Durante la distribuzione ad altre macchine, Regsvr32.exe mi dà il seguente errore quando provo a registrare la DLL:

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

Cosa significa? Nessun tutorial/documentazione che ho letto sulle DLL COM dice qualcosa su "entry-point DLLRegisterServer".

Abbiamo avuto problemi MAJOR utilizzando RegAsm.exe su macchine diverse, quindi abbiamo davvero bisogno di una soluzione in cui possiamo eseguire regsvr32.exe invece che funzionerà per qualsiasi macchina che distribuiamo a (cioè XP, Vista, Windows 7, macchine x86, macchine x64, ecc.)

Cosa devo aggiungere al mio codice C# per renderlo registrabile con regsvr32.exe?

risposta

19

Non è possibile. Le librerie di classi gestite [ComVisible] devono essere registrate con Regasm.exe.

Puoi farlo dall'IDE con Project + Properties, scheda Build, Register for COM interop checkbox. Se si esegue Regasm.exe, in genere si desidera l'opzione della riga di comando/codebase in modo da non dover inserire l'assembly nel GAC. Un'altra opzione è lasciare che Regasm.exe generi un file .reg con l'opzione/regfile. Dovresti eseguirlo sul computer di destinazione per aggiornare il registro.

Modifica: ha appena visto l'osservazione dei "problemi principali". Nota bene quali sono, a corto di/codebase. Devi scegliere la versione giusta su macchine a 64 bit. Ci sono due. E hai bisogno di un prompt dei comandi con privilegi elevati in modo che il controllo dell'account utente non interrompa.

+0

@Hans - 2 domande: Quali sono le 2 versioni per le macchine a 64 bit? C'è un modo per creare, distribuire e utilizzare la DLL COM in VB6 senza registrarlo? –

+0

La versione a 32 e 64 bit. Tecnicamente sì con un manifest di COM privo di registro nell'app client. Ha bisogno di ''. –

+0

@Mike Webb: Come stai facendo l'interoperabilità COM con VB6 devi 1. compilare il progetto C# con un target x86 e 2. usare regasm in c: \ windows \ syswow64. –

0

È possibile creare una semplice applicazione Windows e utilizzare il codice riportato di seguito per registrare DLL COM. Assicurati di aggiungere il file manifest per eseguirlo come amministratore:

... 

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

Cosa succede se un utente ha una versione diversa di .NET Framework? Nel mio caso mi sembra di avere più versioni e molte non hanno affatto RegAsm. Solo v2.0.50727 e v4.0.30319. –

Problemi correlati