C# Can';找不到.NET错误的来源,需要帮助吗
我正在使用.NETFramework2.0编程一个2d平台。我使用的是SFML.NET,因为它是跨平台的,由MONO支持,并且有一个成熟的API。我的问题是,尽管我的程序编译正确,运行正常,但在关闭它时却出现了一个错误 “0x5ed0530e”处的指令引用了“0x0000051c”处的内存。无法“读取”内存 在仔细调试之后,我注意到问题发生在我初始化SFML String2d类之后 什么是错的;为什么在关闭程序时会发生此错误?即使没有什么问题,也有没有办法停止接收错误,这样我的程序的用户就不会被它惹恼 使用制度; 使用SFML.Graphics; 使用SFML.WindowC# Can';找不到.NET错误的来源,需要帮助吗,c#,.net,2d,sfml,C#,.net,2d,Sfml,我正在使用.NETFramework2.0编程一个2d平台。我使用的是SFML.NET,因为它是跨平台的,由MONO支持,并且有一个成熟的API。我的问题是,尽管我的程序编译正确,运行正常,但在关闭它时却出现了一个错误 “0x5ed0530e”处的指令引用了“0x0000051c”处的内存。无法“读取”内存 在仔细调试之后,我注意到问题发生在我初始化SFML String2d类之后 什么是错的;为什么在关闭程序时会发生此错误?即使没有什么问题,也有没有办法停止接收错误,这样我的程序的用户就不会被
namespace ProGUI
{
class TextBox : Sprite
{
private String2D Text;
public TextBox(RenderWindow App)
{
Image = new Image(App.Width, App.Height / 4, new Color(0, 0, 0));
Position = new Vector2(0, App.Height - App.Height / 4);
}
public void SetText(string text)
{
Text = new String2D(text);
Text.Font = new Font("Greyscale_Basic_Bold.ttf");
Text.Position = new Vector2(Position.X + 5, Position.Y + 5);
Text.Size = 12;
}
public string GetText()
{
return Text.Text;
}
public void Render(RenderWindow App)
{
App.Draw(this);
App.Draw(Text);
}
public void MainLoop(RenderWindow App, Color clr)
{
while (App.IsOpened())
{
App.Clear(clr);
App.DispatchEvents();
App.Draw(this);
App.Draw(Text);
App.Display();
}
}
}
}
正如您所看到的,没有不可靠的代码。绝对干净简单。SFML String2d类是否实现IDisposable?是否正确处理所有实例
可能是终结器线程在它们处于无效状态时正在处理它们。编译应用程序后,从visual studio命令行尝试“EditBin.exe/NXCOMPAT:NO C:\AppName.exe”。您会发现
String2d
类:
- 他有一只虫子
- 在应用程序生命周期的错误点被调用
文本
属性的容器?是否有多个线程同时访问Text
属性(在您的例子中,我考虑的是某种游戏循环)
对我来说,由于这是在应用程序关闭时发生的,我希望在运行时处理完表单/窗口后,在关闭期间调用此
SetText
方法。如果您在表单的Closed
事件中设置this.Text
,您会得到类似的结果。您最好在SFML论坛上问这个问题。一个快速的Google出现,表明String2D类型存在问题。此代码将无限递归:
public void Render(RenderWindow App)
{
App.Draw(this);
App.Draw(Text);
}
由于在
Sprite
x
上调用App.Draw
,将调用x.Render(App)
。因此,App.Draw(this)
将在内部调用this.Render(App)
该错误听起来像是来自非托管代码或COM组件。错误中是否包含堆栈跟踪?你能在发生错误的地方发布代码吗?@burningprodigy:当你的应用程序关闭时,是否调用了该代码?如果是的话,为什么?我非常不同意没有什么不对的。您至少未能验证参数、解释整数溢出和正确处置资源。可能不是错误的根源,但您是否曾对您创建的Font
对象调用dispose
?由于您始终使用相同的字体,因此无需每次重新创建对象;创建一次并将其存储在字段中,这将消除一些不必要的处理和内存压力。“尽管C#是静态类型语言,但即使是缩进”也没有多大意义。这让人们对“我检查了一切”产生了一些怀疑。