我花了很多时间来搜索答案,但我没有找到答案。我们有控制台应用程序(exe)和C1报告组件,用于自动打印任务。此应用程序从cmd文件执行,cmd文件由cmdexec每分钟从SQL Server 2014调用。它的工作非常好,但除了GDI + Initialize - System.Drawing.SafeNativeMethods + Gdip.Initialize aproximetelly montly。没有机会解决这个问题所以我们必须重启服务器。
我尝试使用echo命令创建cmd文件。它工作得很好,我得到了echo的输出。所以我只用Console.Writeline(“Hello world”)创建了应用程序。它工作得很好。然后我添加对System.Drawing的引用。什么都没发生 - 产出了。然后我创建了System.Drawing.Bitmap对象,我得到了GDI + Initialize异常。
SQL Server上的作业作为SQLRUNSERVICES运行,它位于Administrator组中。但是当我以SQLRUNSERVICES身份登录并在命令行中启动我们的应用程序时,应用程序可以正常工作。当我作为另一个用户登录时,没有问题。只有SQLRUNSERVICES通过SQL代理。
我认为Windows会话肯定有问题。此应用程序启动,打印一些报告和完成。所以我认为当应用程序完成时,内存将是免费的,GDI对象将是免费的。我检查是否对每个使用GDI的对象都有调用dispose方法。
我是否有机会看到会话使用的GDI对象?或者什么可能导致这个例外?我不能使用任务管理器,因为当应用程序没有运行时,没有什么可看的。
感谢您的回复。对我们来说这是一个非常棘手的问题,因为它在重启服务器后每个月都会重复出现。
答案 0 :(得分:0)
我们创建了最快速打印的测试应用程序,并且我们在一天内获得了此异常。我们称之为C1Report ofcourse的Dispose方法。我们将尝试使用部分。但它看起来像C1错误。测试应用程序打印了约65000个文档计数,然后由GDI + Initialization Exception崩溃。有堆栈:
System.TypeInitializationException: The type initializer for 'Gdip' threw an exception. ---> System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
at System.Drawing.SafeNativeMethods.Gdip.Initialize()
at System.Drawing.SafeNativeMethods.Gdip..cctor()
--- End of inner exception stack trace ---
at System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromScan0(Int32 width, Int32 height, Int32 stride, Int32 format, HandleRef scan0, IntPtr& bitmap)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
at C1.C1Preview.GraphicsHolder.FromBitmap()
at C1.C1Preview.GraphicsHolder.FromScreen()
at C1.C1Preview.C1PrintDocument.SelectBestMeasurementDevice(Boolean showWarning, MeasurementDeviceEnum& measurementDevice, String& measurementPrinterName, GraphicsHolder& measurementGraphicsHolder)
at C1.C1Preview.C1PrintDocument.#fFe()
at C1.C1Preview.C1PrintDocument.SetCreationDevice(MeasurementDeviceEnum creationDevice, String creationPrinterName)
at C1.C1Report.Layout..ctor(C1Report report)
at C1.C1Report.C1Report.Initialize()
at C1.C1Report.C1Report..ctor()