c# - 为什么 WPF 设计器无法加载调用非托管 DLL 的库?

标签 c# wpf visual-studio-2008 c++-cli

我正在使用 Visual Studio 2008、.NET 3.5 SP1,并且有一个包含以下模块的测试应用程序:

  1. C++ DLL
  2. 使用 #1 的 C++/CLI DLL
  3. 使用 #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/

相关文章:

c# - 使用 Baml 管理本地化

visual-studio-2008 - 我可以销售使用 DreamSpark 的 VS2008 创建的应用程序吗?

c# - ClickOnce:在 64 位 Windows 上运行 x86 程序包时出现 BadImageFormatException

c++ - 编译错误

c# - 让 MySqlConnection 空闲会导致超时吗?

c# - 如何将文本框绑定(bind)到日期时间字段但仅显示其日期部分(在 ASP.MVC 中)?

javascript - 如何以动态形式使用模型

c# - Selenium c# 接受确认框

c# - 强制 TextBox 刷新

wpf - 一次定义源并多次使用它