我有一个C#WPF Avalon Dock App,它在.Net Core 3.0下运行良好。我也有一堆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");
}
答案 0 :(得分:0)
可能没有人注意这一点,但这是答案。我的一些代码调用了D3DXMatrixOrthoLH()。删除此呼叫导致错误消失。我唯一能想到的是,它某种程度上正在解决对x86库的方法调用。转向采用DirectXMath而不是d3dxmath的新型工作方式是相当容易的。