Helpex - Trao đổi & giúp đỡ Đăng nhập
19

Có cách nào để chia sẻ định nghĩa enum giữa C ++ gốc (không được quản lý) và C # (được quản lý) không?

Tôi có enum sau được sử dụng trong mã hoàn toàn không được quản lý:

enum MyEnum { myVal1, myVal2 };

Ứng dụng của chúng tôi đôi khi sử dụng một thành phần được quản lý. Thành phần C # đó nhận các giá trị mục enum dưới dạng int thông qua một tệp Interop dll C ++ được quản lý (từ dll gốc). (Dll tương tác chỉ tải nếu thành phần C # là cần thiết.) Thành phần C # đã sao chép định nghĩa enum:

public enum MyEnum { myVal1, myVal2 };

Có cách nào để loại bỏ sự trùng lặp mà không biến dll C ++ gốc thành một dll được quản lý không?

19 hữu ích 0 bình luận 15k xem chia sẻ
19

Bạn có thể sử dụng một tệp .cs duy nhất và chia sẻ nó giữa cả hai dự án. #includetrong C ++ trên tệp .cs sẽ không có vấn đề gì.

Đây sẽ là một tệp .cs ví dụ:

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };

#if !__LINE__
}
#endif

Nếu bạn muốn có nhiều enum trong một tệp, bạn có thể làm điều này (mặc dù bạn phải tạm thời xác định public là không có gì đối với 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
19 hữu ích 3 bình luận chia sẻ
5

Cám ơn vì đã chia sẻ!

Tôi đã chơi xung quanh một chút và tìm ra cách để có nhiều khai báo enum và hằng số mà không có hàng tấn dòng thừa :)

// 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

Hãy nhớ đặt tên tệp của bạn là * .cs

5 hữu ích 0 bình luận chia sẻ
3

Bạn có thể hiển thị thư viện C # cho COM và sau đó nhập thư viện loại vào mã không được quản lý - bằng cách này, bạn sẽ có thể sử dụng enum được xác định trong thư viện C # trong thư viện không được quản lý.

3 hữu ích 2 bình luận chia sẻ
0

C ++ không được quản lý và C # sống ở hai thế giới khác nhau, vì vậy không có cách nào để sử dụng cùng một enum mà không cần thay đổi c ++ DLL thành một thế giới được quản lý.

Và thậm chí sau đó, bạn có thể cần bản sao trong C ++ DLL được quản lý.

Một enum C ++ giống như một danh sách các hằng số, trong khi một enum C # kế thừa lớp Enum, và do đó cung cấp khá nhiều "thủ thuật". Vì vậy, như bạn có thể thấy, chúng rất khác nhau.

Nếu không quan trọng liệu C ++ DLL gốc là bản địa hay được quản lý, tôi sẽ biến nó thành một bản được quản lý và gói các lệnh gọi nguyên bản bên trong một Lớp C ++ được quản lý.

Bằng cách đó, bạn có thể có bản sao enum bên trong C ++ DLL và bạn cũng có thể loại bỏ tất cả các tương tác cùng một lúc :-)

0 hữu ích 0 bình luận chia sẻ
0

Tôi đã gặp vấn đề tương tự trong quá khứ và đã giải quyết nó bằng cách sử dụng các định nghĩa tiền xử lý.

Trong mã không được quản lý của bạn, bên trong tiêu đề cũng có thể được bao gồm bởi trình bao bọc được quản lý của bạn, hãy đặt các mục liệt kê của bạn vào một #define.

Sau đó, trong định nghĩa liệt kê được quản lý và không được quản lý của bạn, hãy sử dụng cùng một #define cho cả hai cách sử dụng.

Sự di chuyển của các bảng liệt kê giữa thế giới được quản lý và không được quản lý trông hơi khó chịu (về cơ bản là cần một dàn diễn viên), nhưng đối với người gọi của bạn trong thế giới không được quản lý, nó sẽ trông ổn.

Chúc may mắn,

0 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# c++ enums native managed , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading