Jak ujawnić typy dopuszczające wartości null przez COM
Od półtora dnia zmagam się z tym problemem, mam nadzieję, że ktoś może mi pomóc. Powiedzmy, że mam takie struktury w C #:
public struct Part
{
public double? x; // or System.Nullable<double> x, doesn't really matter
}
(te struktury reprezentują tabele bazy danych, przekonwertowane z Linq na kod SQL stworzony przez SQLMetal)
Muszę być w stanie ujawnić te struktury, zawierające typy dopuszczające wartości null, do COM, aby mogły być użyte w innej aplikacji (C ++). Ale nie potrafię zrozumieć, jak to zrobić. Pomyślałem, że mogę utworzyć klasy do hermetyzacji typów dopuszczających wartość pustą:
public class NullableDouble
{
private double _Value;
// class methods...
}
public struct Part
{
public NullableDouble x;
}
To działa, ale po stronie C ++ kończę się wskaźnikiem do klasy, ale bez definicji klasy (tylko interfejs):
interface DECLSPEC_UUID("{E8EE4597-825D-3F4C-B20B-FD6E9026A51C}") _NullableDouble;
struct Part
{
MyDll_tlb::_NullableDouble* x;
}
Dlatego nie mogę wyłuskać tego wskaźnika bez definicji klasy, z której można uzyskać dostęp do elementów danych / metod po stronie C ++. To wciąż wydaje się dobrą opcją, jeśli mogę po prostu dowiedzieć się, jak uzyskać definicję klasy w C ++ (jestem nowym użytkownikiem COM).
Myślałem, że mogę użyć niebezpiecznego kodu, ale nie mogę się przekonać, jak konwertować z podwójnego? podwoić * (jestem też nowym użytkownikiem C #!):
unsafe public struct Part
{
public double* x;
}
Part part = new Part()
{
x = AnotherObject.x // AnotherObject.x is a System.Nullable<double>
}
Pomyślałem, że może mógłbym użyć System.Variant, ale C # też tego nie lubi (niespójna dostępność, cokolwiek to znaczy).
public struct Part
{
public Variant x;
// produces 2 errors:
// 1) System.Variant inaccessible,
// 2) inconsistent accessibility
}
Używam C ++ od 20 lat, ale jestem całkiem nowy w COM i C #, więc jest to dla mnie trochę trudna sprawa.
Najgorszy scenariusz ... Po prostu utworzę element boolowski w strukturze dla każdego z typów dopuszczających wartość pustą i użyję tego do wskazania, czy wartość ma być traktowana tak, jakby była pusta. Ale to wydaje się głupie. Z pewnością musi istnieć jakiś sposób na ujawnienie typów dopuszczających wartość zerową za pośrednictwem COM. Dlaczego Microsoft tworzy typy .NET, których nie można używać w COM? Ci faceci w Redmond nie są idiotami (choć czasami wydaje się, że tak jest).
Jakie są moje opcje? Jak najlepiej to zrobić?
Z góry dziękuję.