我在一个名为
TestData
的 dll 中创建了一个结构,然后以 .lib 格式编译该 dll 后,我使用我用 C 编写的内核驱动程序对其进行了测试。这工作得很好,但我希望能够从我的 C 驱动程序到我的 C# 桌面应用程序。这样,我只需在一处修改结构,并使更改在驱动程序和我的 C# 应用程序中生效。话虽这么说,我对 C# 还很陌生,而且我很难让 dll 或 lib(我在两个版本中都尝试过)正常工作。我首先尝试添加引用,但收到了 Please make sure that file is accessible, and that it is valid assembly or COM component
错误。接下来,我偶然发现了 this ,它与操作类似,区别在于操作要求调用函数,而我只想访问结构。但无论哪种方式,我都对评分最高的答案感到困惑,因为它似乎没有引用 dll 中的任何特定内容。
我知道可以在 C# 内部创建结构,并找到了一个通过以下方式完成的示例...
[StructLayout(LayoutKind.Sequential)]
public struct EXAMPLE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public char[] ex1;
public ushort ex2;
}
看起来只需添加一些额外的步骤就可以管理,但如果我可以只使用 dll(或更可能是 lib,以便可以静态加载),那就太理想了。
DLL“导出”只能是函数和数据的地址,调用者必须知道正确的数据类型,包括布局。
.NET 显然有自己的描述类型的元数据格式。 本机的前身是一个“类型库”,主要由 OLE/COM/ActiveX(.NET 的原始名称为“ComPlus”)使用,不是从您编写代码的源语言生成的,而是从专用的 IDL“接口”生成的描述语言”。它可以存储在单独的文件中,也可以作为资源(而不是导出)嵌入到 DLL 中,并且可用于自动生成多种语言的源代码。
但是,虽然 IDL 和类型库确实描述了类型上可用的操作,但它们通常避免了数据的内部内存布局,而仅避免了函数表(C++ 中的 v 表)。 数据的内存布局似乎就是您所追求的。 您可能会求助于以可移植方式描述数据结构的类似技术,例如 ASN.1 或 protobuf,并根据该与语言无关的定义生成 C 和 C# 源代码。