Warnung MSB3391: <DLL> enthält keine Arten, die registriert werden kann für COM-Interop
Habe ich eine einfache C# - DLL (das ist ein Teil von einem viel größeren Projekt) mit VS2005. Muss ich die DLL in Excel über VBA-code so, ich bin mit COM-Interop auf die Montage. Ich bin versuchen, um den build-Prozess generiert automatisch die notwendigen TLB-Datei, so dass ich nicht brauchen, um auf die Kommandozeile aus und verwenden Sie regasm nach jedem build.
Mein problem ist, dass, obwohl die DLL kompiliert und baut feines, generiert er nicht eine TLB-Datei. Stattdessen werden die Fehler in den Titel druckt in der Ausgabe-box.
Ich habe andere DLLs zu bauen TLB-Dateien, indem Sie auf der Projekt-Eigenschaften in VS2005 -> Erstellen -> Leistung -> Check "für COM-interop Registrieren". Auch ich habe [assembly: ComVisible(true)] in der AssemblyInfo.cs.
Hier ist die Zusammenfassung der Quelle für die problem-DLL und der DLL, es verweist, für eine Rückkehr Typ:
using System;
using System.IO;
using System.Runtime.InteropServices;
using SymbolTable;
namespace ProblemLibrary
{
public class Foo
{
public Foo(string filename)
{
...
}
//method to read a text file into a SymbolTable
public SymbolTable BuildDataSet(string[] selected)
{
...
}
}
}
Hier ist eine Zusammenfassung der SymbolTable.dll. Es hat einen Rückgabetyp, dass ProblemLibrary verwendet.
using System;
using System.Collections.Generic;
namespace SymbolTable
{
public class SymbolTable
{
readonly Dictionary<SymbolInfoStub, string> _symbols = new Dictionary<SymbolInfoStub, string>();
/*methods that interact with Dictionary snipped*/
}
}
- Warum müssen Sie die COM-interop? Ich sehe keine COM gibt. Willst du Zugriff auf die C# - Assembly via COM später?
- Ja, ich muss mit dieser DLL in Excel VBA.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, die Sie haben, GuidAttribute in der assembly-Ebene.
Sah ich ein ähnliches problem. Ich bekam eine Fehlermeldung wie:
Ich habe alle Regeln (ComVisible, etc.) aber nichts funktionierte.
Lösung: ich hatte etwas in der default-Konstruktor so, dass es nicht wegoptimiert. In dem moment hatte ich etwas da ist, wird die Registrierung beendet, ohne Meldung und die Komponente wurde sichtbar in der registry.
Interessante Anmerkung: ein Freund von mir es geschafft, sich zu registrieren die original-DLL mit dem leeren default-Konstruktor, der auf seiner Maschine (64-bit-Windows-7, VS2008 Professional -, wie bei mir). Doch sein REGASM.EXE war:
während bei mir war
So, könnte es einige Unterschiede zwischen den Versionen der .NET framework - vielleicht ist die neuere version ist die Optimierung der zu viel und die REGASM nicht berücksichtigen.
In der AssemblyInfo.cs-Datei, stellen Sie sicher, dass Sie Folgendes haben:
UPDATE:
Lesen: Wie kann ich nutzen .NET-Objekten in Excel-VBA?
Die links zu:
http://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/