检测到 CallbackOnCollectedDelegate错误
检测到 CallbackOnCollectedDelegateMessage: 对“江苏省电力视频监控统一平台4.0!Frontier.VideoMonitor.UI.OnResponseDelegate::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。这几天一直被这个问题困扰,请问有哪位高手知道吗,谢谢
FrmReAccept.cs文件:
/// <summary>
/// 带参数构造函数
/// </summary>
/// <param name="rvuId">前画面选择的变电站编号</param>
/// <param name="rvuName">前画面选择的变电站名称</param>
public FrmReAccept(string rvuId, string rvuName)
{
InitializeComponent();
this.onResponse = new OnResponseDelegate(OnResponse);
this.invoke = new InvokeXmlProcess(OnInvoke);
}
/// <summary>
/// 修改按钮点击事件
/// </summary>
/// <param name="sender">事件源</param>
/// <param name="e">事件参数</param>
private void btnModify_Click(object sender, EventArgs e)
{
..................;
Win32.SendPacket(updateSmAndRelTblInfo.WriteXml(),onResponse);//给服务器发送报文,在报文的返回函数里出现如上错误
.....................
}
/// <summary>
/// xml通信委托处理
/// </summary>
/// <param name="response">返回结果</param>
/// <param name="size">结果长度</param>
private void OnResponse(IntPtr response, int size)
{
try
{
................
string xml = Win32.OnResponse(response, size);//这里是上述错误的入口处
................
}
}
Win32.cs文件:
/// <summary>
/// 获取报文字符串
/// </summary>
/// <param name="response">报文指针</param>
/// <param name="size">报文大小</param>
/// <returns>报文字符串</returns>
public static string OnResponse(IntPtr response, int size)
{
DateTime dt = DateTime.Now;
string xml = string.Empty;
byte[] buffer = new byte[size];
for (int i = 0; i < size; ++i)
buffer[i] = Marshal.ReadByte(response, i);//这里是什么非托管代码,我估计是这里出错,但是找不到解决办法
xml = Encoding.UTF8.GetString(buffer);
.................
return xml;
}
我在网上看了些方法,什么静态方法之类的,我都尝试了,还是不行,请问有哪位高手能帮我看看,谢谢 --------------------编程问答-------------------- IntPtr response是这个参数对应的委托被垃圾回收了,你要把这个参数指向的委托变量定义为static就可以避免被垃圾回收,这个问题就解决了, --------------------编程问答-------------------- 谢谢高手指点
补充:.NET技术 , C#