在C#程序中使用C ++常量

时间:2010-07-22 18:55:05

标签: c# c++ interop

我们在C#(WPF)应用程序中使用了一组第三方非托管C ++库,但我们也使用其包含库的子集来构建我们自己的非托管库,以便在我们的应用程序中使用。< / p>

这些库生成元数据,存储在数据库中。但是,我们必须在C#代码中复制与此元数据相关的一些常量,以便使用元数据。

如果某些常量在版本之间发生变化,则存在潜在问题。 C#应用程序是否有一种干净的方法来使用C ++包含文件中定义的常量?

谢谢, WTS

2 个答案:

答案 0 :(得分:3)

您需要在C#包装类中重新定义它们。

不幸的是,如果常量发生变化,您还需要修改副本。 (但是,在版本之间更改常量值是一个非常糟糕的主意,因此希望第三方API不会对您执行此操作...)


话虽如此,有选择。例如,您可以创建一个使用API​​的小型C ++程序,并将所有常量写入具有正确格式的.cs文件中。如果常量在版本之间发生变化(至少,如果值发生变化),这将保护您,但如果需要,您仍需要更新程序以在将来的版本中处理其他常量。

另一个选择是使用C ++ / CLI直接在类中公开常量,并从C#引用该程序集和类。

答案 1 :(得分:3)

我有一个解决方案,你可能不会认为非常“干净”,但哪个会起作用。问题是使用enum或#define预处理程序指令会丢弃您用于常量的符号名称(如ERR_OUT_OF_MEMORY实际上只是某个整数)。

在C ++代码中,您可以定义一个函数,该函数接收符号的字符串名称并返回其值。你可以使用std :: map,然后添加诸如std :: pair(“ERR_OUT_OF_MEMORY”,ERR_OUT_OF_MEMORY)之类的对。然后你可以使用DllImportAttribute从DLL调用该函数,它允许.NET中的非托管互操作。不幸的是,这需要通过和字符串ifing常量,但优点是,如果这些常量改变,它将是自动的。

另一种解决方案是编写一个简单的脚本,该脚本通过预处理程序#defines创建一个巨大的.NET类,其中包含一堆具有相同名称的静态常量。考虑到预处理器的简单性(实际上只需要几行Perl),这实际上并不那么难。