Gil*_*lad 5 c++ wpf interop visual-studio-2010 visual-studio
经过一天的文字和隐喻的撞击,我恳求帮助:
我有一个非托管的C ++项目,该项目被编译为DLL。我们称其为CPP Project。当前,它在不受管的环境中工作。此外,我还创建了一个WPF项目,称为WPF项目。该项目是一个简单的项目,目前几乎为空。它包含一个窗口,我希望它使用Project 1中的代码。为此,我创建了一个CLR C ++项目,该项目应称为Interop Project,也可以编译为DLL。
为简单起见,我将附加一些我已经总结为基础的基本测试代码。
CPP项目具有以下两个测试文件:
测试器
#pragma once
extern "C" class __declspec(dllexport) NativeTester
{
public:
void NativeTest();
};
Run Code Online (Sandbox Code Playgroud)
测试器
#include "tester.h"
void NativeTester::NativeTest()
{
int i = 0;
}
Run Code Online (Sandbox Code Playgroud)
Interop项目具有以下文件:
互操作库
#pragma once
#include <tester.h>
using namespace System;
namespace InteropLib {
public ref class InteropProject
{
public:
static void Test()
{
NativeTester nativeTester;
nativeTester.NativeTest();
}
};
}
Run Code Online (Sandbox Code Playgroud)
最后,WPF项目有一个使Interop项目不完整的窗口:
MainWindow.xaml.cs
using System;
using System.Windows;
using InteropLib;
namespace AppGUI
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InteropProject.Test();
}
}
}
Run Code Online (Sandbox Code Playgroud)
XAML本身有一个空窗口(默认创建)。
尝试运行WPF项目后,出现以下错误:
'System.Windows.Markup.XamlParseException:'对与指定的绑定约束匹配的'AppGUI.MainWindow'类型的构造函数的调用引发了异常。行号“ 3”和行位置“ 9”。---> System.IO.FileNotFoundException:无法加载文件或程序集“ InteropLib.dll”或其依赖项之一。指定的模块无法找到。
在AppGUI.MainWindow..ctor()
有趣的是,如果我不从CPP Project导出类,则不会收到此错误。说,如果我更改tester.h为:
#pragma once
class NativeTester
{
public:
void NativeTest()
{
int i = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,我无法使用更复杂的类。如果像以前一样将实现转移到cpp文件,则由于未导出代码而导致无法解决的链接错误。我要实际使用的C ++代码很大,有很多类,并且是面向对象的,所以我不能只将所有实现都移到h文件中。
请帮助我了解我一直试图解决但未成功的可怕错误。
谢谢。
这从一开始就出错了,你的 tester.h 文件不正确。当您构建测试器项目时,该类应该仅具有 __declspec(dllexport) 属性。使用 DLL 的任何其他项目都必须看到具有 __declspec(dllimport) 属性的类。通过使用 tester.h 中的宏开始修复此问题:
#undef EXPORTED
#ifdef BUILDING_DLL
# define EXPORTED __declspec(dllexport)
#else
# define EXPORTED __declspec(dllimport)
#endif
class EXPORTED NativeTester {
// etc..
};
Run Code Online (Sandbox Code Playgroud)
在您的测试器项目中,使用 C/C++、预处理器、预处理器定义并添加 BUILDING_DLL。
接下来的事情是确保 DLL 存储在正确的目录中。这就是异常所抱怨的,它找不到 DLL。C++ 项目的构建目录是 Debug,但 WPF 项目的构建目录是 bin\Debug。通过更改“常规 + 输出目录”设置来修复此问题,将其设置为$(SolutionDir)$bin\(ConfigurationName).
生成 C++ 项目并验证是否可以在解决方案的 bin\Debug 目录中找到 DLL。并检查您是否还有 .lib 文件,构建 C++/CLI 项目时需要该文件。作为额外的验证步骤,从 Visual Studio 命令提示符运行 Dumpbin.exe /exports foo.dll 并检查您是否确实看到导出的类。
接下来的 C++/CLI 项目,您需要以相同的方式更改输出目录设置。将 .lib 文件添加到链接器的“附加依赖项”属性中。如果您跳过该步骤,您将得到您所讨论的那种链接器错误。构建它并验证您是否再次在正确的 bin\Debug 目录中获得了 DLL。
对发布配置重复这些更改。
设置项目依赖,WPF项目依赖C++/CLI项目。C++/CLI 项目依赖于 C++ 项目。这确保了项目按照正确的顺序构建。
您现在应该可以很好地在 WPF 项目中使用这些 DLL。
| 归档时间: |
|
| 查看次数: |
837 次 |
| 最近记录: |