【发布时间】:2023-06-11 10:38:02
【问题描述】:
将 VB 代码从 XNA 3.1 转换为 MonoGame。
任何访问GraphicsAdapter 类的尝试都会引发以下异常。例如,尝试枚举 GraphicsAdapters。在这一行:
For Each adapter As GraphicsAdapter In GraphicsAdapter.Adapters
结果是异常:
System.TypeInitializationException occurred
HResult=-2146233036
Message=The type initializer for 'Microsoft.Xna.Framework.Graphics.GraphicsAdapter' threw an exception.
Source=MonoGame.Framework
TypeName=Microsoft.Xna.Framework.Graphics.GraphicsAdapter
StackTrace:
at Microsoft.Xna.Framework.Graphics.GraphicsAdapter.get_Adapters()
at ...my code...
InnerException:
HResult=-2146233054
Message=Could not load type 'SharpDX.Rectangle' from assembly 'SharpDX, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1'.
Source=MonoGame.Framework
TypeName=SharpDX.Rectangle
StackTrace:
at Microsoft.Xna.Framework.Graphics.GraphicsAdapter.CreateAdapter(Adapter1 device, Output monitor)
at Microsoft.Xna.Framework.Graphics.GraphicsAdapter.PlatformInitializeAdapters(ReadOnlyCollection`1& adapters)
at Microsoft.Xna.Framework.Graphics.GraphicsAdapter..cctor()
注意内部异常:
Could not load type 'SharpDX.Rectangle' from assembly 'SharpDX, ...Version=4.0.1.0, ...
该项目引用了这些程序集(以及其他):
- MonoGame.Framework 版本=3.6.0.1625
来自 NuGet“MonoGame.Framework.WindowsDX”,文件
包\MonoGame.Framework.WindowsDX.3.6.0.1625\lib\net40\MonoGame.Framework.dll - SharpDX 版本=4.0.1.0
- SharpDX.Direct2D1 版本=4.0.1.0
- SharpDX.Direct3D9 版本=4.0.1.0
- SharpDX.DXGI 版本=4.0.1.0
- SharpDX.Mathematics 版本=4.0.1.0
所以我不明白为什么它会以这种方式失败。
可能出了什么问题?与此 SharpDX 版本不兼容?
注意:这些都是来自 NuGet 的最新包,在 Visual Studio 2015 中。针对 .Net 4.5.2。
更新
为了证明 SharpDX 没有问题,我将这一行放在 GraphicsAdapter 行之前:
Dim testRect As SharpDX.Rectangle = New Rectangle()
这成功创建了testRect。在尝试访问GraphicsAdapter 之前没有例外。还尝试了GraphicsAdapter 的所有其他共享(静态)属性,例如GraphicsAdapter.DefaultDevice。任何一个都失败了,但有同样的例外。
【问题讨论】:
-
您能显示其余的堆栈跟踪吗?您删除并替换为“..My Code..”的部分可能会提供重要的上下文,例如您在应用程序生命周期中的哪个位置访问适配器。
-
@BradleyUffner - 它在编辑历史中。在确定它与 TypeInitializationError 无关后,我将其删除,其 InnerException 是从 SharpDX 加载类型失败,该类型已经加载(请参阅我的更新)。我还测试了对 GraphicsAdapter 的所有其他共享字段的访问,确认它不是特定于适配器列表的。并在应用程序“稳定下来”后通过将访问置于按钮事件上对其进行测试。
-
我现在正在获得帮助 on MonoGame forum。问题解决后,我将在此处复制它作为答案。