2010-11-16 25 views
12

Mam aplikację VB6, która używa biblioteki DLL COM. DLL jest napisany w języku C#. We właściwościach projektu C# mam zaznaczoną opcję "Register for COM interop". Aplikacja VB6 działa dobrze na mojej maszynie programistycznej. Kod C# Wynika z tego formatu dokładnie: CodeProject C# COM ExampleJak zarejestrować DLL DLL napisane w języku C# z Regsvr32?

Podczas wdrażania do innych maszyn Regsvr32.exe daje mi następujący błąd, gdy próbuję zarejestrować DLL:

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

Co to oznacza? Żadne samouczki/dokumentacja, którą czytałem o bibliotekach DLL COM nie mówią nic o "entry-point DLLRegisterServer".

Mieliśmy poważne problemy z używaniem RegAsm.exe na różnych komputerach, więc naprawdę potrzebujemy rozwiązania, w którym można uruchomić regsvr32.exe zamiast tego, które będzie działać dla każdej maszyny, na której się wdrażamy (tj. XP, Vista, Windows 7, maszyny x86, maszyny x64 itd.)

Co muszę dodać do mojego kodu C#, aby można było zarejestrować się w regsvr32.exe?

Odpowiedz

19

Nie możesz. Zarządzane biblioteki klas [ComVisible] muszą być zarejestrowane przy pomocy Regasm.exe.

Możesz to zrobić z poziomu IDE za pomocą Project + Properties, zakładki Build, Register for COM interop checkbox. Jeśli uruchamiasz Regasm.exe, zazwyczaj potrzebujesz opcji wiersza poleceń/codebase, więc nie musisz umieszczać zespołu w GAC. Kolejną opcją jest zezwolenie Regasm.exe na wygenerowanie pliku .reg z opcją/regfile. Po prostu uruchomisz to na komputerze docelowym, aby zaktualizować rejestr.

Edytuj: właśnie zobaczyłem uwagę na "poważne problemy". Zwróć uwagę, jakie one są, skrót od/codebase. Musisz wybrać odpowiednią wersję na 64-bitowych komputerach. Istnieją dwa. Potrzebny jest wiersz polecenia z podwyższonym poziomem uprawnień, aby UAC go nie zatrzymywał.

+0

@Hans - 2 pytania: Jakie są 2 wersje dla maszyn 64-bitowych? Czy istnieje sposób na tworzenie, wdrażanie i używanie biblioteki DLL COM w VB6 bez jej rejestracji? –

+0

Wersja 32-bitowa i 64-bitowa. Zasadniczo tak, z manifestem COM wolnym od rejestru w aplikacji klienckiej. Wymaga ''. –

+0

@Mike Webb: Podczas wykonywania współdziałania COM z VB6 musisz: 1. skompilować projekt C# z celem x86 i 2. użyć regresji pod c: \ windows \ syswow64. –

0

Możesz utworzyć prostą aplikację Windows i użyć poniższego kodu, aby zarejestrować COM DLL. Pamiętaj, aby dodać plik manifestu do uruchomienia jako Administrator:

... 

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

Co zrobić, jeśli użytkownik ma inną wersję architektury .NET Framework? W moim przypadku wydaje mi się, że mam wiele wersji i wiele z nich nie ma RegAsm. Działa tylko v2.0.50727 i v4.0.30319. –