Visual Studio无法在设计模式下加载本机dll

本文关键字:加载 本机 dll 设计模式 Studio Visual | 更新日期: 2023-09-27 18:16:19

我有一个c# WPF应用程序,它使用DllImport加载一个本地C dll。DLL函数被映射到c#类。

WPF设计器试图加载DLL,因为窗口的ViewModel构造函数调用了本机函数,但是找不到DLL。

我已经将DLL复制到输出目录,应用程序运行良好,可以调试和进入DLL,只是设计器抱怨,有时挂起Visual Studio。

我试过把Dll放在我的项目目录和obj目录中,但无济于事。

Visual studio 2012在哪里尝试从。

Visual Studio无法在设计模式下加载本机dll

加载本地dll ?

我在包装一些遗留c++库代码的Wrapper c++/CLI DLL中遇到此错误,我在下面的链接中找到了一些信息。我看了看我的C:驱动器在我的AppData'Local'Microsoft'VisualStudio'12.0'Designer'ShadowCache中,我看到VisualStudio正在将包装器DLL复制到一系列临时文件夹中,但不是本地c++ DLL。我通过运行"Everything"实用程序来确认,并在ShadowCache文件夹中包含的文件夹中看到我的DLL的许多副本,其中没有一个具有本机DLL。

为了利用Visual Studio的设计器视图,不得不创建特殊的进程、脚本或批处理文件,这是一件很遗憾的事情,但据我所知,没有什么好办法可以解决这个问题。

我所做的是在我的C:驱动器上创建一个文件夹,其中包含我当前或最终可能用c++/CLI实现包装的每个本机DLL,并将该文件夹添加到我的Environment PATH语句中。在此更新之后,我没有抛出异常。

为什么WPF设计器无法加载调用非托管dll的库?

你总是可以在你的类中创建一个" initialize()"方法,并将有问题的代码从构造函数移到初始化器。当您在运行时实例化该类时,当然会调用initialize()方法,但是在XAML中代码不会运行。

正如其他人提到的,你可以检查你是否在设计时,这当然是不优雅的。

我经常使用的另一种方法是创建"DesignerData"包装类。

例如:

public class MyDesignerData
{
   private static MyViewModel _vm;
   public MyViewModel ViewModel
   {
       get { return _vm; }
   }
   public MyDesignerData()
   {
       _vm = new MyViewModel();
       //do stuff to setup MyViewModels properties
       //with data that you want to see in the designer
   }
}

在你的视图中,你可以这样使用这个类:

<UserControl x:Class="UI.MyViews"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:UI.MyViews"
             d:DataContext="{Binding AnalysisVm, Source={d:DesignInstance 
                  IsDesignTimeCreatable=True, Type={x:Type local:MyDesignerData}}}"

当然,现在使用XAML HotReload,有时我只是忘记了在某些情况下与设计器打交道。这真的会变成一段糟糕的时光!