So machen Sie nullfähige Typen über COM verfügbar

Ich habe anderthalb Tage mit diesem Problem zu kämpfen, hoffentlich kann mir jemand helfen. Nehmen wir an, ich habe Strukturen wie diese in C #:

public struct Part
{
    public double? x;  // or System.Nullable<double> x, doesn't really matter
}

(Diese Strukturen stellen Datenbanktabellen dar, die von Linq in von SQLMetal erstellten SQL-Code konvertiert wurden.)

Ich muss in der Lage sein, diese Strukturen, die nullfähige Typen enthalten, für COM verfügbar zu machen, damit sie in einer anderen Anwendung (C ++) verwendet werden können. Aber ich kann für mein ganzes Leben nicht herausfinden, wie ich das machen soll. Ich dachte, ich könnte Klassen erstellen, um die nullfähigen Typen zu kapseln:

public class NullableDouble
{
    private double _Value;
    // class methods...
}

public struct Part
{
    public NullableDouble x;
}

Das funktioniert, aber auf der C ++ - Seite erhalte ich einen Zeiger auf eine Klasse, aber keine Klassendefinition (nur eine Schnittstelle):

interface DECLSPEC_UUID("{E8EE4597-825D-3F4C-B20B-FD6E9026A51C}") _NullableDouble;

struct Part
{
    MyDll_tlb::_NullableDouble* x;
}

Daher kann ich diesen Zeiger nicht ohne eine Klassendefinition dereferenzieren, von der aus auf die Datenelemente / Methoden auf der C ++ - Seite zugegriffen werden kann. Dies scheint immer noch eine gute Option zu sein, wenn ich nur herausfinden kann, wie die Klassendefinition in C ++ abgerufen werden kann (ich bin neu in COM).

Ich dachte, ich könnte vielleicht unsicheren Code verwenden, aber ich kann nicht herausfinden, wie man von double konvertiert. zu verdoppeln * (ich bin auch neu in C #!):

unsafe public struct Part
{
    public double* x;
}

Part part = new Part()
{
    x = AnotherObject.x // AnotherObject.x is a System.Nullable<double>
}

Ich dachte, ich könnte vielleicht System.Variant verwenden, aber C # mag das auch nicht (inkonsistente Zugänglichkeit, was auch immer das bedeutet).

public struct Part
{
    public Variant x;  
    // produces 2 errors: 
    //   1) System.Variant inaccessible, 
    //   2) inconsistent accessibility
}

Ich benutze C ++ seit 20 Jahren, aber ich bin ziemlich neu in COM und C #, daher ist dies für mich ein ziemlicher Kampf.

Worst-Case-Szenario ... Ich erstelle nur ein boolesches Element in der Struktur für jeden der nullbaren Typen und gebe damit an, ob der Wert so behandelt werden soll, als wäre er null. Aber das kommt mir einfach blöd vor. Sicherlich muss es eine Möglichkeit geben, nullfähige Typen über COM verfügbar zu machen. Warum sollte Microsoft .NET-Typen erstellen, die in COM nicht verwendet werden können? Diese Leute in Redmond sind keine Idioten (obwohl es manchmal so scheint).

Also, was sind meine Möglichkeiten? Wie geht das am besten?

Danke im Voraus.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage