3

我有 C#、C++ 和 C++/CLI 项目的解决方案。更具体地说:它是 C++ 核心(约 5 个非托管 dll)、C++/CLI 核心包装器和具有项目特定业务逻辑的 C# 程序集。

前段时间我发现 VS 2008 表单设计器 (WinForms) 有时无法加载核心包装程序集。在使用 VS 调试器和 Procmon 几个小时后,我发现 VS 无法加载程序集,因为它无法解析包装器所依赖的非托管库。VS 从 PATH 环境变量中搜索每个系统文件夹和文件夹,但不在包装程序集所在的文件夹中搜索。

此外,我在一个程序集中有 2 个表单,一个是从另一个继承的:VS 表单设计器可以很好地加载父表单,但无法加载继承的表单。

所以,这是我的问题:有人知道这种行为的原因吗?

PS我使用了解决方法:将带有项目二进制文件的文件夹添加到PATH变量,但我仍然想知道原因。

4

1 回答 1

0

您是否尝试将二进制文件放入可执行文件文件夹中?因为我确定.NET 只搜索已知路径(作为路径存储在%PATH%中)和可执行文件的本地文件夹。

我不知道确切的原因,但我认为这是因为 DLL 不知道从中加载它的路径(托管 DLL 的做法!),并且只查看当前目录和其他已知路径。

但是有一个解决方法,您可以为 Visual-Studio 创建一个启动可执行文件并执行以下操作之一:

SetDllDirectory-片段:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern Boolean SetDllDirectory(String pathName);
于 2012-10-15T14:06:53.910 回答