cuốn sách gpt4 ai đã làm

c# - 我想从 C++ 非托管代码调用 C# 委托(delegate)。无参数委托(delegate)工作正常,但带参数的委托(delegate)使我的程序崩溃

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 02:05:59 39 4
mua khóa gpt4 Nike

Dưới đây là mã chức năng từ dll không được quản lý. Nó chấp nhận một con trỏ hàm làm đối số và chỉ trả về giá trị được hàm được gọi trả về.

extern __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)());
bên ngoài __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)())
{
int r = pt2Func();
trả lại r;
}

Trong mã C# được quản lý, tôi sử dụng đại biểu để gọi hàm umaged ở trên.

  đại biểu công cộng không an toàn int mydelegate( );

int công cộng không an toàn delFunc()
{
trả lại 12;
}

mydelegate d = mydelegate mới(delFunc);
int re = callDelegate(d);
[DllImport("cmxConnect.dll")]
riêng tư không an toàn tĩnh extern int callDelegate([MarshalAs(UnmanagedType.FunctionPtr)] ​​​​mydelegate d);

Tất cả đều ổn và tốt! Nhưng nếu tôi muốn con trỏ/đại biểu hàm của mình chấp nhận các tham số, nó sẽ làm hỏng chương trình. Vì vậy, nếu tôi sửa đổi mã như sau, chương trình của tôi sẽ gặp sự cố.

C++ không được quản lý đã sửa đổi -

extern __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)(int));
bên ngoài __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)(int))
{
int r = pt2Func(7);
trả lại r;
}

Mã C# đã sửa đổi -

đại biểu công cộng không an toàn int mydelegate( int t);

int công cộng không an toàn delFunc(int t)
{
trả lại 12;
}

mydelegate d = mydelegate mới(delFunc);
int re = callDelegate(d);

câu trả lời hay nhất

Quy ước gọi sai cho con trỏ hàm. Làm cho nó trông như thế này:

 int (__stdcall * pt2Func)(args...)

Về C# - Tôi muốn gọi đại biểu C# từ mã C++ không được quản lý. Đại biểu không tham số hoạt động tốt, nhưng đại biểu được tham số hóa làm hỏng chương trình của tôi. https://stackoverflow.com/questions/3374433/

39 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress