2016-05-20 28 views
0

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?

+0

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. –

+0

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. –

Antwort

0

Wie Hans Passant sagte, war dies kein VBA-Fehler, sondern ein Fehler in der .NET COM-Bibliothek.

Durch die Festsetzung der COM-Bibliothek konnte ich die Out-Parameter wie es sollte funktionieren.

Vielen Dank für Ihre Unterstützung!

0

Ich bin kein VB.NET-Typ, aber alles, was ich sagen kann, dass VB.NET nicht out entspricht. Der mögliche Ansatz besteht darin, das Attribut < Out > zu verwenden, wenn Sie die Methode Bar importieren. Es hängt dann davon ab, wie der Compiler es einrichtet.