#include C# 中的等效项,用于在程序的 C 和 C# 版本之间共享静态数据

#include equivalent in C# to share static data between a C and a C# version of a program

提问人:user3256556 提问时间:11/8/2023 最后编辑:user3256556 更新时间:11/9/2023 访问量:92

问:

我有一个 .h 文件,它是我在 C 程序中编写的,其中包含大量静态数据(大致如下:对于好奇的人来说,它是星坐标的目录)。#includeunsigned char const table[bignumber]={.....};

现在,我在多年来编写的许多 C 和 C++ 应用程序中使用相同的文件。有时我必须添加一些 s 来自定义它,但它本质上是一样的,这很棒,因为我可以轻松地在此文件中进行 1 次更改并更新 3 或 4 个应用程序。#define

现在我正在编写一个 C# 应用程序,我想重用同一个文件。有什么办法可以做到吗?

几天后更新...

显然没有办法在 C# 中做我想做的事:-(

我最终做的是使用我的一个包含数据的 C 程序来输出与数据等效的 C#......

数据大约是 40KB 的原始字节......在 C 中,这在我的代码中被编译为 const 数据,需要 40Kb...在加载程序文件时,加载数据(再次作为原始数据)时,加载数据不会产生运行时成本。

在我使用的嵌入式系统上,完全没有成本,因为它只是在闪存中,可以直接读取...... 在 C# 中,我最终不得不声明在启动时实例化的表,这些表本身将从运行时实例化的对象构建 (object[] var= new []{new object(...),....})...

最终结果是,我的代码增长了近 500kb,包含了 40kb 的数据!!!而且我猜还有不可忽视的启动时间成本......难怪现代程序如此庞大和缓慢:-(

感谢您的指点。.

西里尔语

C# C++ C

评论

4赞 Charlieface 11/8/2023
也许使用 T4 文本模板来翻译它?C 标头通常不是有效的 C# 代码。
1赞 Ralf 11/8/2023
编写一个 c 程序,通过可以从 Net 调用的方法显示它。编写托管 c++ 程序以显示是要在 Net 中使用的托管类。使用具有一些搜索和替换功能的工具,从您的 h 文件中获得符合 c# 的内容。
1赞 John Bollinger 11/8/2023
在运行时分析文件,而不是在编译时生成数据。额外的优势:当您偶尔进行其中一项更改时,您甚至不需要重新构建程序。
0赞 Jabberwocky 11/8/2023
我会将 C 标头转换为与语言无关的格式(xml、json、csv 或任何适合您且易于解析的格式),并在程序启动期间在运行时解析该文件。

答:

0赞 Lajos Arpad 11/8/2023 #1

您可以将 C 标头转换为 C# 文件,然后使用它。有多种工具可供选择,例如这个: https://www.ispirer.com/application-conversion/c-c-to-cs-migration

现在,如果更改 C 文件,可能还需要自动更改 C#,这可能是在部署期间自动执行的步骤。

或者,您可以创建一个 DLL 并使用它,例如,请参阅 https://www.microsoft.com/en-us/download/details.aspx?id=55979。也可以重新生成和重写 DLL。

构建 DLL 似乎是个好主意,因此如果有多个项目和应用程序使用它,那么他们可以将其刷新到构建过程中。

评论

0赞 Dai 11/9/2023
“或者你可以创建一个DLL并使用它” - 请详细说明它是如何工作的 - 因为(据我所知)你可以从C获得“导出”的唯一方法是使用Win32 COM IDL(或WinMD),这是非常复杂的.......dll
0赞 Lajos Arpad 11/10/2023
此页面对@Dai有帮助?codeproject.com/Articles/9826/......
0赞 Dai 11/11/2023
该文章仅介绍了普通的 C 函数导出 - 任何用于使用这些函数的 C# 程序都不会自动获取 C 程序和其他结构/常量/数据,它们仍然必须在 C# 中手动重新定义。DllImport#define