我已经为这个问题苦苦挣扎了一天半,希望有人可以帮助我。假设我在 C# 中有这样的结构:
public struct Part
{
public double? x; // or System.Nullable<double> x, doesn't really matter
}
(这些结构代表数据库表,从 Linq 转换为 SQLMetal 创建的 SQL 代码)
我需要能够向 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<double>
}
我想也许我可以使用 System.Variant,但 C# 也不喜欢这样(不一致的可访问性,不管这意味着什么)。
public struct Part
{
public Variant x;
// produces 2 errors:
// 1) System.Variant inaccessible,
// 2) inconsistent accessibility
}
我已经使用 C++ 20 年了,但我对 COM 和 C# 还很陌生,所以这对我来说有点困难。
最坏的情况...我将在结构中为每个可为空的类型创建一个布尔成员,并使用它来指示是否将值视为空值。但这似乎很愚蠢。当然,必须有某种方法可以通过 COM 公开可空类型。Microsoft 为什么要创建不能在 COM 中使用的 .NET 类型?雷德蒙德的那些家伙不是白痴(尽管有时看起来确实如此)。
那么,我有哪些选择?做这个的最好方式是什么?
提前致谢。