1

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

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

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

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

4

3 回答 3

1

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

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

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

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

于 2008-11-18T03:34:08.250 回答
1

旧线程,但是由于我刚刚遇到该问题并在此过程中发现了此问题,因此将我的解决方案提交给了类似的问题。由于您正在包装控件,因此仅访问类型可能不像我的那样容易修复。

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

于 2013-03-18T16:25:54.693 回答
0

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

于 2008-11-18T09:22:40.107 回答