尝试在设计器中删除Form上的UserControl时出现System.IO.FileNotFoundException异常

时间:2008-11-18 03:12:42

标签: .net visual-studio-2008 user-controls designer

我在托管C ++中创建了一个自定义UserControl,它包含了一些本机代码控件。我已经确认控件在运行时工作,并且一直试图通过允许从设计器工具箱中拖放控件来使控件与Visual Studio设计器一起工作。

虽然我已成功将UserControl添加到工具箱,但是当我将控件拖到窗体上时没有任何反应。为了解决这个问题,我打开了第二个Visual Studio 2008实例,并将其调试器附加到我试图使用UserControl的devenv.exe实例。将UserControl放到Windows窗体上后,Visual Studio调试器在尝试加载包含UserControl的模块时在mscorlib.dll中输出FileNotFoundException。

我注意到设计器没有从项目的输出路径加载dll,而是在%UserData%\ VisualStudio \ 9.0 \ ProjectAssemblies \ RandomFolderName 文件夹中创建程序集的副本。但是,没有复制模块的依赖项,我认为它是FileNotFoundException的源。

有任何想法如何解决此问题?理想情况下,Vistual Studio会在将dll复制到ProjectAssemblies文件夹时复制所有程序集的依赖项,但我无法找到实现此目的的任何方法。

3 个答案:

答案 0 :(得分:1)

Visual Studio不知道任何非托管依赖项。您必须复制自己的dll或将它们复制到windows \ system32目录中。

另外两种处理此问题的策略。

  1. 用另一个程序集包装此程序集,并使用assembly.loadfrom手动加载混合的dll。此功能将为您的混合模式dll设置正确的加载目录。

  2. 在混合程序集中使用loadlibrary加载本机依赖项dll,这样就可以提供它们的路径。

答案 1 :(得分:1)

旧线程,但是因为我刚刚遇到问题并在此过程中发现了这个问题,所以我将解决方案提交给了类似的问题。由于你正在包装一个控件,它可能不像我的只需访问类型那么简单。

基本上我只是在我的包装器C ++ / CLI库中使本机DLL延迟加载。由于包装器的C ++ / CLI部分包含Visual Studio和框架使用的接口规范,因此永远不需要或加载本机DLL。我在这个问题中回答了更多细节: https://stackoverflow.com/a/15481687/34440

答案 2 :(得分:0)

尽量不要在将访问文件的控件的构造函数中放置任何内容。 如果必须,有时DesignTime属性有助于跳过违规行。