Vì vậy, những gì tôi có là API C++ chứa trong * .dll và tôi muốn sử dụng ứng dụng C# để gọi các phương thức trong API.Hiển thị API C++ cho C#
Cho đến nay tôi đã tạo ra một dự án C++/CLR bao gồm các bản ngữ C++ API và quản lý để tạo ra một lớp "cầu nối" mà trông hơi giống như sau:
// ManagedBridge.h
#include <CoreAPI.h>
using namespace __CORE_API;
namespace ManagedAPIWrapper
{
public ref class Bridge
{
public:
int bridge_test(void);
int bridge_test2(api_struct* temp);
}
}
.
// ManagedBridge.cpp
#include <ManagedBridge.h>
int Bridge::bridge_test(void)
{
return test();
}
int Bridge::bridge_test2(api_struct* temp)
{
return test2(temp);
}
Tôi cũng có ứng dụng C# có tham chiếu đến C++/CLR "Bridge.dll" và sau đó sử dụng các phương pháp chứa bên trong. Tôi có một số vấn đề với điều này:
- tôi không thể tìm ra cách để gọi bridge_test2 trong chương trình C#, vì nó không có kiến thức về những gì một api_struct thực sự là. Tôi biết rằng tôi cần phải sắp xếp đối tượng ở đâu đó, nhưng tôi có làm điều đó trong chương trình C# hoặc cầu C++/CLR không?
- Điều này có vẻ như một số dài nhất để lộ tất cả các phương pháp trong API, không phải là cách dễ dàng hơn mà tôi bỏ lỡ? (Điều đó không sử dụng P/Invoke!)
EDIT: Ok, vì vậy tôi đã có những điều cơ bản làm việc bây giờ nhờ vào phản ứng dưới đây, tuy nhiên struct của tôi (gọi nó là "api_struct2" ví dụ này) có cả nội dung gốc và công đoàn trong mã gốc C++, như sau:
typedef struct
{
enum_type1 eEnumExample;
union
{
long lData;
int iData;
unsigned char ucArray[128];
char *cString;
void *pvoid;
} uData;
} api_struct2;
Tôi nghĩ rằng tôi đã tìm ra cách để có được enum làm việc; Tôi đã khai báo lại nó trong mã được quản lý và đang thực hiện một "native_enum test = static_cast (eEnumExample)" để chuyển đổi phiên bản được quản lý thành native.
Tuy nhiên, công đoàn đã khiến tôi bối rối, tôi không thực sự chắc chắn làm thế nào để tấn công nó .. Ý tưởng bất cứ ai?
Vì vậy, điều này có nghĩa là tôi tạo managed_api_struct trong C++/CLI * .dll hoặc trong chính mã C#? Ngoài ra, tôi nghĩ rằng bạn có thể chuyển một cấu trúc được quản lý đến mã gốc miễn là bạn sử dụng thuộc tính StructLayout? – Siyfion
Nó không quan trọng, nhưng C++/CLI có ý nghĩa để tránh phụ thuộc vòng tròn. Có, [StructLayout] hoạt động nhưng bạn * phải * sử dụng lệnh gọi Marshal :: StructureToPtr(). Bố cục của cấu trúc được quản lý không thể dự đoán được. –
Ok cảm ơn, tôi sẽ cho rằng một đi ngay bây giờ, xem nơi tôi nhận được quá. – Siyfion