Ich habe eine COM-DLL, die in C# geschrieben wurde. Ich benutze die DLL von VBA (MS Access 2010).Referenz (out) Parameter in VBA bei Verwendung von C# COM DLL
Einige Funktionen in der DLL enthalten out
Parameter, die nicht korrekt funktionieren, wenn sie aus VBA verwendet werden: VBA gibt den Fehler "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt" beim Aufruf der Funktion. Alle anderen Funktionen in der DLL-Klasse funktionieren ordnungsgemäß.
VBA-Code:
Dim par0 As String
par0 = "test"
Dim outPar1 As Boolean
Dim outPar2 As myDllNamespace.Foo
Set outPar2 = New myDllNamespace.Foo
Dim outPar3 As String
dllClassInstance.Bar par0 outPar1 outPar2 outPar3
C# COM-DLL-Code (Klasse für dLLClassInstance):
[ProgId("myDllNamespace.DllTestClass")]
[Guid(...),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(IDllTestClass))]
public class DllTestClass : IDllTestClass
{
public void Bar(string filter, out bool success, out Foo entries, out string html) { ... }
}
C# COM-DLL-Schnittstelle Code (Interface für die Klasse):
[Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IDllTestClass
{
void Bar(string filter, [Out] out bool success, [Out] out Foo entries, [Out] out string html);
}
Warum wirft VBA den Fehler "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt", obwohl alle Variablen einen Wert haben und die drei letzten Parameter sind Out Parameter sowieso?
Das ist eine .NET-Ausnahme, NullReferenceException, kein VBA-Fehler. Es wird sicher im '{...}' Code generiert. Verwenden Sie den Debugger, um den Code zu durchlaufen, oder halten Sie an, wenn die Ausnahme ausgelöst wird. Projekt> Eigenschaften> Registerkarte Debug> Externes Programm starten. –
Obwohl dies nicht die Ursache für Ihr spezifisches Problem sein sollte, beachten Sie, dass weder VBA noch VB6 [out] -Parameter unterstützen. Sie tun es am besten, indem sie sie als [in, out] behandeln. Wie Sie sich vorstellen können, reicht diese Behinderungsbehandlung von "ok", über "Ressourcenverlusten" bis hin zu "Abstürzen", abhängig von der genauen Verwendung. Wenn Ihr COM-Client VB6 oder VBA ist, verwenden Sie stattdessen [in, out]. um sicherzustellen, dass .NET/COM Interop in dem Witz ist. –