无法将 c# .Net Core 3.0 与 directx 9.0 依赖项链接

Posted

技术标签:

【中文标题】无法将 c# .Net Core 3.0 与 directx 9.0 依赖项链接【英文标题】:Can't link c# .Net Core 3.0 with directx 9.0 dependency 【发布时间】:2019-09-30 20:36:33 【问题描述】:

我有一个在 .Net Core 3.0 下运行良好的 C# WPF Avalon 停靠应用程序。我还有一堆 C++ 本机代码,我为此编写了一个 C++ .Net 包装器,我正在尝试将其集成到其中。所有链接都正常,但是当它尝试加载我的包装器 DLL 时,它会因“尝试被用来加载格式不正确的程序。”错误。

我尝试在不同的 C++ 库中调用 C++ 日志记录方法,没有任何问题。我将此库中的所有编译参数复制到了我的 directx 库,但问题仍然存在。我将 d3dx9.dll、d3dx9_43.dll 和 d3dx9d_43.dll 复制到了与包装 DLL 恰好是同一目录的可执行目录中。我已经在配置管理器中验证了所有库和可执行文件的配置和平台都是相同的。

这是我的 DLL 包装代码。当我注释掉 DX 调用时,dll 加载没有问题。一旦我取消注释 Direct3DCreate9() 调用,当它尝试加载 dll 时就会出现不正确的格式错误。包装 DLL 链接没有错误。 头文件:

#pragma once

namespace ADIVSdll 
    public ref class ADIVSInterop
    
    public:
        void startLive(System::IntPtr handle);
        void startPlayback(System::String^ str);
    private:
    ;

实现文件:

#include "pch.h"
#define _AMD64_
#include "ADIVSdll.h"
#include <wtypes.h>
#include "CppUtil/Logger.h"
#include <../../Microsoft DirectX SDK (June 2010)/include/d3d9.h>

void ADIVSdll::ADIVSInterop::startLive(System::IntPtr handle)

    HWND hWnd = (HWND) (long long)handle;
    //IDirect3D9* md3dObject = Direct3DCreate9(D3D_SDK_VERSION);
    Logger::init("log.log");

【问题讨论】:

既然您已经完成研究并验证这不是位数问题(x86 与 x64)......这篇文章需要更多信息来进一步调查。 不确定您还需要什么信息。要重新创建,请使用我的代码创建 .Net WPF 应用程序和 C++ .Net DLL。运行,您将看到问题。我将添加头文件。 【参考方案1】:

可能没有人注意到这一点,但这里是答案。我的一些代码调用了 D3DXMatrixOrthoLH()。删除此调用会导致错误消失。我唯一能想到的是,它以某种方式解决了对 x86 库的方法调用。使用 DirectXMath 而不是 d3dxmath 迁移到新的处理方式相当容易。

【讨论】:

以上是关于无法将 c# .Net Core 3.0 与 directx 9.0 依赖项链接的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ODBC 连接从 .Net Core 3.0 访问

C# 8.0和.NET Core 3.0的新内容有哪些?

属性路由在 asp.net core 3.0 中无法正常工作

将 OpenID Connect 与 .NET Core 3.0 ASP.NET Core API 服务一起使用时出错

ASP.NET Core 3.0 [FromBody] 字符串内容返回“无法将 JSON 值转换为 System.String。”

将 webpack 构建与 ASP.NET Core 3.0 集成的最佳方式?