Как выставить обнуляемые типы через COM
Я боролся с этой проблемой в течение полутора дней, надеюсь, кто-то может мне помочь. Позволять'скажем, у меня есть такие структуры в C #:
public struct Part
{
public double? x; // or System.Nullable x, doesn't really matter
}
(эти структуры представляют таблицы базы данных, преобразованные из Linq в код SQL, созданный SQLMetal)
Мне нужно иметь возможность выставить эти структуры, содержащие обнуляемые типы, для COM, чтобы они могли использоваться в другом приложении (C ++). Но я не могу понять, для жизни меня, как это сделать. Я думал, что смогу создать классы для инкапсуляции типов, допускающих обнуление
public class NullableDouble
{
private double _Value;
// class methods...
}
public struct Part
{
public NullableDouble x;
}
Такого рода работы, но на стороне C ++ я получаю указатель на класс, но без определения класса (только интерфейс):
interface DECLSPEC_UUID("{E8EE4597-825D-3F4C-B20B-FD6E9026A51C}") _NullableDouble;
struct Part
{
MyDll_tlb::_NullableDouble* x;
}
Таким образом, я не могу разыменовать этот указатель без определения класса для доступа к членам / методам данных на стороне C ++. Это все еще кажется хорошим вариантом, если я могу просто выяснить, как получить определение класса в C ++ (яя новичок в COM).
Я подумал, что могу использовать небезопасный код, но я могуне понять, как конвертировать из двойного? удвоить * (яЯ тоже новичок в C #!):
unsafe public struct Part
{
public double* x;
}
Part part = new Part()
{
x = AnotherObject.x // AnotherObject.x is a System.Nullable
}
Я думал, может быть, я мог бы использовать System.Variant, но C # неТоже не нравится (непоследовательная доступность, что бы это ни значило).
public struct Part
{
public Variant x;
// produces 2 errors:
// 1) System.Variant inaccessible,
// 2) inconsistent accessibility
}
Я использую C ++ в течение 20 лет, но я довольно плохо знаком с COM и C #, так что это немного для меня.
В худшем случае ... яЯ просто создам логический член в структуре для каждого из типов, допускающих значение NULL, и используем его, чтобы указать, следует ли рассматривать значение как нулевое. Но это только кажется глупым. Конечно, должен быть какой-то способ выставлять обнуляемые типы через COM. Почему Microsoft создает .NET типы, которые могутиспользовать в COM? Эти парни в Редмонде неидиоты (хотя иногда это так кажется).
Итак, каковы мои варианты? Каков наилучший способ сделать это?
Заранее спасибо.