代码之家  ›  专栏  ›  技术社区  ›  sean e

是否可以在C和非托管C++之间共享EnUM声明?

  •  17
  • sean e  · 技术社区  · 15 年前

    是否有一种方法可以在原生(非托管)C++和(托管)C语言之间共享EnUM定义?

    我在完全非托管代码中使用了以下枚举:

    enum MyEnum { myVal1, myVal2 };
    

    我们的应用程序有时使用托管组件。C组组件通过托管C++互操作DLL(从本地DLL)获得枚举项值作为int。(仅当需要C组件时才加载interop dll。)C组件复制了枚举定义:

    public enum MyEnum { myVal1, myVal2 };
    

    有没有一种方法可以在不将原生C++ DLL转换成托管DLL的情况下消除复制?

    5 回复  |  直到 15 年前
        1
  •  17
  •   jjxtra    10 年前

    您可以使用单个.cs文件并在两个项目之间共享它。 #include 在C++上对.cs文件应该没有问题。

    这是一个.cs文件示例:

    #if !__LINE__    
    namespace MyNamespace
    {
        public 
    #endif
    
    // shared enum for both C, C++ and C#
    enum MyEnum { myVal1, myVal2 };
    
    #if !__LINE__
    }
    #endif
    

    如果你想在一个文件中使用多个枚举,你可以这样做(尽管你必须暂时定义公共对于C/C++来说是无用的):

    #if __LINE__
    #define public
    #else
    namespace MyNamespace
    {
    #endif
    
        public enum MyEnum { MyEnumValue1, MyEnumValue2 };
        public enum MyEnum2 { MyEnum2Value1, MyEnum2Value2 };
        public enum MyEnum3 { MyEnum3Value1, MyEnum3Value2 };
    
    #if __LINE__
    #undef public
    #else
    }
    #endif
    
        2
  •  4
  •   Johan Torp    12 年前

    谢谢分享!

    我花了点时间,找到了一种方法,可以有多个枚举和常量声明,而不需要大量的额外行:)

    // This is a valid C, C++ and C# file :)
    #if __LINE__
    #define public
    #else
    namespace MyCSharpNamespace{
    #endif
    
        public enum MyConstant { MaxStr = 256 };
        public enum MyEnum1{ MyEnum1_A, MyEnum1_B };
        public enum MyEnum2{ MyEnum2_A, MyEnum2_B };
    
    #if __LINE__
    #undef public
    #else
    }
    #endif
    

    记住将文件命名为*.cs

        3
  •  3
  •   sharptooth    15 年前

    您可以将C库公开给COM,然后将类型库导入到非托管代码中-这样,您就可以使用非托管库中C库中定义的枚举。

        4
  •  0
  •   Steffen    15 年前

    非托管C++和C语言存在于两个不同的世界中,所以不存在使用相同枚举的方法,而不需要将C++ DLL更改为托管EnUM。

    即使这样,您可能需要在托管C++ DLL中重复。

    C++EnUM很像一个常数列表,而C.Y.EnUM继承了EnUM类,因此提供了相当多的“技巧”。如你所见,他们是 非常 不同的。

    如果本地C++DLL是本地的还是托管的,那么我就把它变成托管的,并在托管C++层中封装本机调用。

    这样你就可以在C++的DLL中实现EnUM复制,也可以同时删除所有的互操作:

        5
  •  0
  •   Adrian Conlon    15 年前

    我以前也遇到过同样的问题,并用预处理器定义解决了它。

    在非托管代码中,在也可以由托管包装器包含的头中,将枚举项放入define。

    然后,在托管和非托管枚举定义中,对这两种用法使用相同的定义。

    托管世界和非托管世界之间的枚举移动看起来有点讨厌(基本上需要强制转换),但是对于非托管世界中的调用者来说,它看起来和感觉都很好。

    祝你好运,