我正在使用 Visual Studio 2008、.NET 3.5 SP1,并且有一个包含以下模块的测试应用程序:
- C++ DLL
- 使用 #1 的 C++/CLI DLL
- 使用 #2 的 C# WPF 应用程序
当我尝试将 #2 中的类用作 WPF XAML 中的资源时,设计器不允许我:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lib1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" <- ERROR
错误是:“未找到程序集‘ClassLibrary1’。确认您没有缺少程序集引用。另外,确认您的项目和所有引用的程序集都已构建。”
但是当我在应用程序主窗口的代码隐藏中使用 C++/CLI DLL 中的类时,一切正常。 Class1 已创建,并在其构造函数中调用 C++ DLL,没问题。
using ClassLibrary1;
...
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
//use in code-behind
Class1 tmp = new Class1();
tmp.FirstName = "foo";
Title = tmp.FirstName;
}
}
如果我修改 C++/CLI 程序集,删除它对 C++ DLL 的调用并重建所有内容,设计人员就会停止提示并毫无怨言地加载 C++/CLI 程序集。
我怀疑这个问题与 WPF 设计器查找动态库的位置有关。
最佳答案
由于 Visual Studio 设计器将您的程序集复制到一个临时位置,但不会复制您的非托管依赖项,因此您可能会遇到此问题。
虽然不理想,但最简单的解决方案是将包含非托管依赖项的文件夹添加到 PATH
环境变量,然后用该 DevEnv.exe
启动 路径
。
您可以通过以下方式执行此操作:
- 使用计算机 -> 属性将文件夹添加到系统环境变量
- 使用设置路径的批处理文件,然后启动 DevEnv
此解决方案的问题是,随着非托管依赖项的重建,Visual Studio 倾向于“卡在”它们上或不使用新的依赖项,因此您最终需要在使用设计器完全正确地退出并重新启动 Visual Studio重建一切,这可能会有点痛苦。
关于c# - 为什么 WPF 设计器无法加载调用非托管 DLL 的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036631/