经过一天的头撞墙之后,我恳求帮助:
我有一个非托管 C++ 项目,它被编译为 DLL。我们就这样称呼它吧光热发电项目。它目前在非托管环境中运行。另外,我还创建了一个WPF项目,该项目将被称为WPF项目。该项目是一个简单且目前几乎是空的项目。它包含一个窗口,我希望它使用项目 1 中的代码。为此,我创建了一个 CLR C++ 项目,该项目应称为互操作项目并且也被编译为DLL。
为了简单起见,我将附上一些我已归结为基础的基本测试代码。
CPP项目有以下两个测试文件:
tester.h
#pragma once
extern "C" class __declspec(dllexport) NativeTester
{
public:
void NativeTest();
};
测试程序.cpp
#include "tester.h"
void NativeTester::NativeTest()
{
int i = 0;
}
Interop 项目有以下文件:
互操作库.h
#pragma once
#include <tester.h>
using namespace System;
namespace InteropLib {
public ref class InteropProject
{
public:
static void Test()
{
NativeTester nativeTester;
nativeTester.NativeTest();
}
};
}
最后,WPF 项目有一个引用 Interop 项目的单一窗口:
MainWindow.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
to:
#pragma once
class NativeTester
{
public:
void NativeTest()
{
int i = 0;
}
};
但是,在这种情况下,我无法使用更复杂的类。如果我像以前一样将实现移动到 cpp 文件,由于我没有导出代码,我会遇到未解决的链接错误。我想要实际使用的 C++ 代码很大,有很多类,并且是面向对象的,所以我不能将所有实现都移到 h 文件中。
请帮助我理解这个可怕的错误,我一直在尝试解决但没有成功。
Thanks.