You can pass a reference class with a CLR array to a native function, and modify the class, using PInvoke services.
Example
Compile the following native library.
В | ![]() |
---|---|
// modify_ref_class_in_native_function.cpp // compile with: /LD #include <stdio.h> #include <windows.h> struct S { wchar_t* str; int intarr[2]; }; extern "C" { __declspec(dllexport) int bar(S* param) { printf_s("str: %S\n", param->str); fflush(stdin); fflush(stdout); printf_s("In native: intarr: %d, %d\n", param->intarr[0], param->intarr[1]); fflush(stdin); fflush(stdout); param->intarr[0]=300;param->intarr[1]=400; return 0; } }; |
Compile the following assembly.
В | ![]() |
---|---|
// modify_ref_class_in_native_function_2.cpp // compile with: /clr using namespace System; using namespace System::Runtime::InteropServices; [StructLayout(LayoutKind::Sequential, charset=utf-8::Unicode)] ref class S { public: [MarshalAsAttribute(UnmanagedType::LPWStr)] String ^ str; [MarshalAsAttribute(UnmanagedType::ByValArray, ArraySubType=UnmanagedType::I4, SizeConst=2)] array<Int32> ^ intarr; }; [DllImport("modify_ref_class_in_native_function.dll", charset=utf-8::Unicode)] int bar([In][Out] S ^ param); int main() { S ^ param = gcnew S; param->str = "Hello"; param->intarr = gcnew array<Int32>(2); param->intarr[0] = 100; param->intarr[1] = 200; bar(param); // Call to native function Console::WriteLine("In managed: intarr: {0}, {1}", param->intarr[0], param->intarr[1]); } |
Output
В | |
---|---|
str: Hello In native: intarr: 100, 200 In managed: intarr: 300, 400 |