VS2012设计器无法加载程序集。

3
有一个解决方案,使用C#项目引用一个托管的C++库,该库又引用了一个本地的C++库。C#项目包含BaseUserControl和ChildUserControl两个控件,后者继承自前者。
问题是:如果在BaseUserControl的构造函数中调用来自本地C++的代码(通过托管的C++库),则无法在设计器视图中查看ChildUserControl;同时也不能将BaseUserControl或ChildUserControl添加到窗体中。我们会收到以下错误提示:
“Could not load file or assembly 'TestLibCPP, Version=1.0.4877.30347, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.”
我们该如何解决这个问题?
我已经包含了一个简单的VS2012解决方案simple VS2012 solution,演示了这个问题。这是一个虚构的例子,基于我们最近从VS2005转换到VS2012的大型代码库中遇到的问题。
谢谢。

1
这是不可避免的,当设计师加载它时,Windows需要能够找到该本地DLL。它搜索的位置太少了,在PATH上存储它是必需的,但非常脆弱。最好把DLL分成两个部分。 - Hans Passant
有没有不需要32位编译的答案?我设立了悬赏,因为我们的应用程序是64位的,并且存在这个问题。把所有东西都编译成32位不是选项。 - Denise Skidmore
刚看到子问题...为什么不直接更改C++的dll而不是x64呢?这样你就可以将C#部分保留在任何目标上。我用给定的示例进行了测试,效果非常好。 - zewa666
4个回答

0
如果您有源代码,请尝试使用配置(X86平台)重新构建解决方案,然后尝试使用设计器打开ChildUserControl。

0

问题可能是您的本地dll是在32位配置的基础上构建的,请尝试在32位平台上构建您的项目


0

尝试将 GUITest 平台目标更改为 x86。当前为“任何 CPU”。无论您使用的是 64 位还是 32 位计算机,都可以执行此操作。还要确保检查配置中的平台 (调试、发布等)。


0

问题正是基于您的C++项目的X86架构。您的WinForms项目引用了“任何CPU”。

我已经包含了一张图片,以向您展示在哪里更改它(抱歉,它是德语的,但您应该可以从屏幕上的位置找到它:)

  1. 右键单击您的Winforms项目并转到设置
  2. 切换到编译选项卡(猜测这是它的英文名称)
  3. 将目标平台更改为x86
  4. 构建并享受乐趣;)

How to change Target Platform

编辑:

我刚刚看到赏金问题是关于将所有设置都设置为64位,所以要实现这一点,只需将C++ dlls的目标设置为x64架构即可。

  1. 右键单击任何一个c++ DLL并转到设置
  2. 在上部区域,您将看到一个名为配置管理器的按钮
  3. 在新打开的窗口中,只需将所有C++ dlls设置为x64。
  4. 如果无法选择,请单击箭头并为第二个项目创建一个新的x64(不是ARM)架构,取消选中“创建新”复选框并选择先前创建的架构。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接