【问题标题】:TypeInitializationException accessing MonoGame GraphicsAdapter.Adapters, could not load type 'SharpDX.Rectangle'TypeInitializationException 访问 MonoGame GraphicsAdapter.Adapters,无法加载类型“SharpDX.Rectangle”
【发布时间】: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。问题解决后,我将在此处复制它作为答案。

标签: monogame sharpdx


【解决方案1】:

我在 MonoGame 论坛上发布了同样的问题:
http://community.monogame.net/t/solved-typeinitializationexception-accessing-graphicsadapter-adapters-could-not-load-type-sharpdx-rectangle/9803

问题原因:

当前版本的 MonoGame.Framework for WindowsDX(Windows 操作系统 + DirectX 驱动程序)3.6.0.1625 是针对 SharpDX 2.6.3 构建的,并且与更新的 SharpDX 版本不兼容。

(临时)解决方案:

MonoGame 的开发者分支确实针对当前的 SharpDX。可以从 MonoGame 的 teamcity 获得构建(需要免费注册)。
测试 MonoGame.Framework build 3.7.0.994;它适用于 SharpDX 4.0.1:
http://teamcity.monogame.net/viewLog.html?buildId=56483&tab=artifacts&buildTypeId=MonoGame_PackagingWindows

该版本将大多数 SharpDX dll 安装到
C:\Program Files (x86)\MonoGame\v3.0\Assemblies\Windows
但是,SharpDX.Mathematics.dll 目前不见了, 所以我仍然从 NuGet 安装 SharpDX,而不是使用那些。


MonoGame 版本的标准位置:
(寻找至少 3.7,在我写这篇文章时,它还没有):
http://www.monogame.net/downloads/

(如果不是 MonoGame 和 SharpDX 的 NuGet 包,我已经下载了 MonoGame 3.6 安装程序并在@使用 its 版本的 SharpDX dll 987654326@,那么我就不会出现这种不兼容问题。但是,对于我的目的来说,这还不够新的 SharpDX。这应该通过发布 MonoGame 3.7 来解决)

【讨论】:

    最近更新 更多