使用用于 Windows 桌面的 C# .NET 应用程序进行 3D 渲染。在具有双显卡配置(例如集成 Intel 视频和 NVidia)的笔记本电脑上,可能会出现问题,即用户没有将 NVidia 控制面板设置更改为更喜欢 NVidia 卡。因此,应用程序可能会选择集成视频并表现不佳。
如果是这个非托管代码,可以执行以下操作从主 exe 导出一个整数,显然 NVidia 软件会检测到这一点,然后强制应用程序使用 NVidia 卡运行,而无需用户更改控制面板设置(需要他们这样做是不现实的,并且会导致对应用程序性能的第一印象不好)。
extern "C" {
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}
为了使用 .NET C# 可执行文件执行上述操作(显然它必须是主 exe 而不是 DLL),我正在尝试使用以下链接中概述的方法。
http://lucasmagder.com/blog/2014/05/exporting-data-symbols-in-c-for-nvidia-optimus/
该方法是在构建后,反汇编.exe,然后修改IL,在虚拟方法的开头插入以下内容,然后重新组装修改后的IL,创建一个新的exe。
.export [0] as NvOptimusEnablement
然后在运行时,它会做更多的事情来获取值集。但是,问题是当我们尝试运行时,我们会从程序集加载中得到以下错误。
Could not load file or assembly '...' or one of its dependencies. Attempt to load an unverified executable with fixups (IAT with more than 2 sections or a TLS section.) (Exception from HRESULT: 0x80131019
搜索此错误表明这是由还包含非托管代码的托管程序集引起的,这当然正是我们正在尝试做的事情(Exception with Resolving assembly: Attempt to load an unverifiable executable with fixups)。
其他人有这方面的经验吗?我猜想什么时候创建了这个解决方法,这一切都奏效了,但也许现在程序集加载更严格了?Anyonw知道解决方法吗?