经过一天的从字面上和比喻上把我的头撞到墙上后,我请求帮助:
我有一个非托管 C++ 项目,它被编译为 DLL。我们称之为CPP 项目。它目前在非托管环境中工作。另外,我创建了一个 WPF 项目,名为WPF Project。这个项目是一个简单且目前几乎是空的项目。它包含一个窗口,我希望它使用项目 1 中的代码。为此,我创建了一个 CLR C++ 项目,该项目应称为Interop Project,也被编译为 DLL。
为简单起见,我将附上一些我已经归结为基础的基本测试代码。
CPP项目有以下两个测试文件:
测试者.h
#pragma once
extern "C" class __declspec(dllexport) NativeTester
{
public:
void NativeTest();
};
测试器.cpp
#include "tester.h"
void NativeTester::NativeTest()
{
int i = 0;
}
互操作项目具有以下文件:
互操作库
#pragma once
#include <tester.h>
using namespace System;
namespace InteropLib {
public ref class InteropProject
{
public:
static void Test()
{
NativeTester nativeTester;
nativeTester.NativeTest();
}
};
}
最后,WPF 项目有一个引用互操作项目的单一窗口:
主窗口.xaml.cs
using System;
using System.Windows;
using InteropLib;
namespace AppGUI
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InteropProject.Test();
}
}
}
XAML 本身有一个空窗口(默认创建)。
一旦我尝试运行 WPF 项目,就会收到以下错误:
System.Windows.Markup.XamlParseException:'调用与指定绑定约束匹配的类型'AppGUI.MainWindow'的构造函数引发异常。行号“3”和行位置“9”。---> System.IO.FileNotFoundException:无法加载文件或程序集“InteropLib.dll”或其依赖项之一。指定的模块无法找到。
在 AppGUI.MainWindow..ctor()
有趣的是,如果我不从 CPP 项目中导出类,我不会收到此错误。说,如果我tester.h
改为:
#pragma once
class NativeTester
{
public:
void NativeTest()
{
int i = 0;
}
};
但是,在这种情况下,我不能使用更复杂的类。如果我像以前一样将我的实现移动到一个 cpp 文件,由于我没有导出我的代码,我会得到未解决的链接错误。我想要实际使用的 C++ 代码很大并且有很多类并且是面向对象的,所以我不能将我的所有实现都移到 h 文件中。
请帮助我理解这个可怕的错误,我一直在尝试解决但没有成功。
谢谢。