【发布时间】:2016-02-19 18:18:02
【问题描述】:
我在一个解决方案中有两个项目:
MyWinForm - 带有自定义用户控件的 32 位项目
MyClassLibrary - 一个需要 64 位进行数学运算的 64 位项目
微软“强迫”我生成 32 位程序集的用户控件。 See here for reference
我的数学模型“强迫”我需要 64 位数学运算。
如果我引用 MyClassLibrarywithin MyWinForm 并将其维护为 64 位程序集,那么我的数学运算将成功完成;但是,我不能再使用自定义用户控件。如果我尝试将我的自定义用户控件拖放到设计器界面,则会收到以下错误:“无法加载工具箱项目,它将被删除”。
如果我引用 MyClassLibrarywithin MyWinForm 并将其维护为 32 位程序集,那么我的数学运算将失败并出现 OutOfMemory 异常(由于 32 位最大大小限制)。
如何设置我的解决方案以允许同时引用自定义用户控件和 64 位类库,从而避免这些问题?
我真的很想能够使用工具箱和设计界面。我有一种预感,我需要在运行时加载自定义用户控件,以便动态编译器知道如何决定是 32 位还是 64 位。在我看来,这违背了使用 Visual IDE 的目的。
【问题讨论】:
-
您不能在 32b 进程中使用 64b 库,因为该库是在进程空间中加载的,因此必须是 32b
-
有解决办法吗?
-
嗯,一开始不是直接的,但是你可以创建两个单独的进程,一个用于 32b GUI,另一个用于 64b 数学类,并将它们与 tcp/pipes/shared memory 相互通信,你可以启动 32b,它会启动一个不可见的进程,然后您可以混合使用。提示,堆栈溢出是因为没有剩余堆栈,您是否尝试增加 32b 进程的堆栈大小?
-
如果将所有 32 位组件更改为 AnyCPU,会遇到什么问题?
-
确保也清除“首选 32 位”复选框 - 真正的问题是您是否在将 WinForm 应用程序作为 x64 运行时遇到任何问题(很明显,设计时间需要为 x86,但它应该没有对实际运行应用程序的影响)