为什么COM Interop将VB6布尔值视为C#Short?

Gid*_*sey 4 .net c# vb6 com com-interop

我有一个遗留的VB6应用程序,它定义了以下结构:

Public Type DrawDown
    Date As Date
    Amount As Currency
    CapitaliseInterest As Boolean
End Type
Run Code Online (Sandbox Code Playgroud)

使用生成互操作程序集,tlbimp.exe但结构最终如下:

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct DrawDown
{
    public DateTime Date;
    [MarshalAs(UnmanagedType.Currency)]
    public decimal Amount;
    public short CapitaliseInterest;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用.NET 4.0.

为什么VB6 Boolean会被转换为C#short而不是bool

Dav*_*ras 12

VB6使用VARIANT_BOOL类型,

在这里找到关于它的信息和历史:BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. boo

VARIANT_BOOL来到了一边.

typedef short VARIANT_BOOL; define VARIANT_TRUE((VARIANT_BOOL)-1)定义VARIANT_FALSE((VARIANT_BOOL)0)这是由Visual Basic人员开发的.Basic使用-1表示"true",0表示"false",VARIANT_BOOL用于保留此行为.


Jon*_*nna 8

因为它是一个.

VB6 bool是16位值,其中0表示false,任何非零表示为true,但设置为true的值设置为-1(0xFFFF).这种方式很多bools与数字的组合很好地与VB6一起工作,因为x AND TRUE给出x,x OR FALSE给出x,x AND FALSE给出FALSE等等,对于逐位和布尔运算符具有相同的逻辑.不幸的是,这也意味着4 AND 2尽管存在是假的TrueThing AND OtherTrueThing,所以谨慎的VB6编码器并没有过度依赖它,而是用来CBool强制该值为0或-1.

通常,我们可以选择使用自然机器尺寸来获得机器处理速度,而不是使用单个字节,因为它是最小的可寻址单元,因此具有尺寸优势.当16位机器的自然尺寸当然是16位时,当我们拥有32位和64位机器时,平衡更有利于自然尺寸.Visual Basic 1.0在DOS和Windows 3.0上运行,可以运行在英特尔80286 16位处理器上,所以选择并不奇怪.

在COM世界中,我们有VARIANT_BOOL,这只是另一种说法"bool,按照VB6的方式完成它们"的方式,以允许跨语言兼容.C#中最接近的东西是short或者ushort,如果我们只关心C#,我们也可以选择.首先,我们倾向于使用签名而不是无符号值,这将使我们倾向于short,但也不ushort是符合CLS的类型,并且在获得与COM的兼容性时几乎没有任何一点引入与其他.NET语言的不兼容性!因此short是明确的选择.