【发布时间】:2012-01-25 22:50:12
【问题描述】:
我有一个旧版 VB6 应用程序,它定义了以下结构:
Public Type DrawDown
Date As Date
Amount As Currency
CapitaliseInterest As Boolean
End Type
使用tlbimp.exe 生成互操作程序集,但结构最终如下:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct DrawDown
{
public DateTime Date;
[MarshalAs(UnmanagedType.Currency)]
public decimal Amount;
public short CapitaliseInterest;
}
我正在使用 .NET 4.0。
为什么 VB6 Boolean 被翻译成 C# short 而不是 bool?
【问题讨论】:
-
你确定你没有重新排序成员?
-
我确定。 C# 是从 JustDecompile 中打开的程序集复制而来的。
-
我对 VB6 不够熟悉,无法确定,但重新排序字段似乎是错误的。尽管 Davide 关于所涉及的实际类型的回答都是正确的,但无论哪种情况。
-
@JaredPar 自从我不得不深入研究 VB6 在幕后所做的事情已经有一段时间了,但我隐约记得,如果您更改字段的源顺序,它将尝试保持内存顺序以避免破坏二进制兼容性。不要相信我的话,正如我所说的那样已经有一段时间了。
-
@JonHanna:出于好奇,我使用 OleView 检查类型库中的布局。它与 VB6 源代码的顺序相匹配。奇怪的是,互操作程序集中的顺序发生了变化。
标签: c# .net com vb6 com-interop