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在哪里尝试从。
我在包装一些遗留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,有时我只是忘记了在某些情况下与设计器打交道。这真的会变成一段糟糕的时光!