VB.net使用从dll管理的回调非托管

VB.net使用从dll管理的回调非托管,vb.net,memory-management,callback,dllimport,Vb.net,Memory Management,Callback,Dllimport,我想使用dll中的函数: <DllImport("netXTransport.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto, ExactSpelling:=True)> _ Public Shared Function xSysdeviceUpload(ByVal hSysdevice As IntPtr, ByVal ulChannel As UInt32, ByVal ulMo

我想使用dll中的函数:

<DllImport("netXTransport.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto, ExactSpelling:=True)> _
 Public Shared Function xSysdeviceUpload(ByVal hSysdevice As IntPtr, ByVal ulChannel As UInt32, ByVal ulMode As UInt32, ByVal pszFileName As IntPtr, ByVal pabFileData As IntPtr, ByVal pulFileSize As IntPtr, ByVal pfnCallback As PFN_NXAPI_PROGRESS_CALLBACK, ByVal pfnRecvPktCallback As PFN_NXAPI_BROWSE_CALLBACK, ByVal pvUser As IntPtr) As Int32
 End Function
(有关信息,C界面为:

int32_t APIENTRY xSysdeviceUpload(CIFXHANDLE  hSysdevice, uint32_t ulChannel, uint32_t ulMode, char* pszFileName, uint8_t* pabFileData, uint32_t* pulFileSize, PFN_PROGRESS_CALLBACK pfnCallback, PFN_RECV_PKT_CALLBACK pfnRecvPktCallback, void* pvUser)`;)
My
pfnCallback
函数在托管内存(vb.net)中完成:

如果没有声明回调(
AddressOfTcprenderProgressBar
被任何内容替换),则所有回调都会正常运行,但是如果我声明
(AddressOf)TCPRenderProgressBar
,我看到我传入了函数
TCPRenderProgressBar
,但在

有什么问题


感谢您的帮助

查看Marshal.GetFunctionPointerForDelegate方法。我尝试了GetFunctionPointerForDelegate函数,我认为它是我搜索的函数,但结果是相同的…Dim回调作为PFN\u NXAPI\u PROGRESS\u CallBack=TCPRenderProgressBar Dim pffunction的地址作为IntPtr=Marshal.GetFunctionPointerForDelegate(回调)“上传文件iResult=xSysdeviceUpload(g_-hSysdevice、端口系统、下载模式文件、pszFileName、pFile、pFileLength、pFunction、Nothing、Nothing)另请阅读备注部分:
您必须手动防止垃圾回收器从托管代码收集委托。垃圾回收器不会跟踪对非托管代码的引用。
有很多方法可以使用这些声明解决问题。INTPTR太多了,可能只是通过E传递的参数相反,让回调的调用约定出错是一个标准错误。没有一个错误可以从问题中诊断出来,本机声明丢失并且文档记录太差。
int32_t APIENTRY xSysdeviceUpload(CIFXHANDLE  hSysdevice, uint32_t ulChannel, uint32_t ulMode, char* pszFileName, uint8_t* pabFileData, uint32_t* pulFileSize, PFN_PROGRESS_CALLBACK pfnCallback, PFN_RECV_PKT_CALLBACK pfnRecvPktCallback, void* pvUser)`;)
<AllowReversePInvokeCalls()>
Public Shared Sub TCPRenderProgressBar(ByVal ulStep As UInt32, ByVal ulMaxStep As UInt32, ByVal pvUser As IntPtr, ByVal bFinished As Char, ByVal lError As Int32)
End Sub
Dim pFile As IntPtr = Marshal.AllocHGlobal(CInt(FileLength))
Dim pFileLength As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(FileLength))
Dim pszFileName As IntPtr = Marshal.AllocHGlobal(szFileName.Length)
Dim Temp() As Byte = g_encoding.GetBytes(szFileName & " ")
Temp(szFileName.Length) = 0
Marshal.Copy(Temp, 0, pszFileName, (szFileName.Length + 1))

iResult = xSysdeviceUpload(g_hSysdevice, 0, DOWNLOAD_MODE_FILE, pszFileName, pFile, pFileLength, AddressOf TCPRenderProgressBar, Nothing, Nothing)