【发布时间】:2016-06-10 19:53:29
【问题描述】:
我的本机代码中有以下内容:
typedef void (__stdcall * HandlerCallBack)(float);
class ASSIMP_API NewProgressHandler : public ProgressHandler
{
HandlerCallBack CallBack;
public:
bool Update(float percentage = -1.f){
if (CallBack) CallBack (percentage);
return true;
}
void SetCallBack (HandlerCallBack callback) {
CallBack = callback;
}
};
void Importer::SetProgressHandlerCallBack (HandlerCallBack CallBack) {
NewProgressHandler* pNewHandler = new NewProgressHandler ();
pNewHandler->SetCallBack (CallBack);
ProgressHandler* pHandler = pNewHandler;
SetProgressHandler (pHandler);
}
我需要打电话
SetProgressHandlerCallBack (HandlerCallBack CallBack)
来自 c# 代码,所以我执行以下操作:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void HandlerCallBack([MarshalAs(UnmanagedType.R4)]float percent);
[DllImport("my.dll")]
public static extern void SetProgressHandlerCallBack ([MarshalAs(UnmanagedType.FunctionPtr)]
HandlerCallBack callBack);
public void AssimpCallBack ([MarshalAs(UnmanagedType.R4)]float percent) {
Debug.Log (percent);
}
void SomeFunction () {
HandlerCallBack cb = new HandlerCallBack (AssimpCallBack);
SetProgressHandlerCallBack (cb);
}
但我遇到了一个例外,
SetProgressHandlerCallBack
at(包装器托管到本机) ModellInstantiator:SetProgressHandlerCallBack (ModellInstantiator/HandlerCallBack)
我不知道我错过了什么。
【问题讨论】:
-
您看到的异常是什么?
-
您认为 C++\CLI 包装器可能吗?这是一种非常干净和自然的方式来规避所有声明式编组的内容。
-
SetProgressHandlerCallBack at (wrapper managed-to-native) ModellInstantiator:SetProgressHandlerCallBack (ModellInstantiator/HandlerCallBack) 这就是我能看到的。
标签: c# c++ callback marshalling