【问题标题】:How to setup solution for 32-bit winform that references 64-bit class library?如何为引用 64 位类库的 32 位 winform 设置解决方案?
【发布时间】: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,但它应该没有对实际运行应用程序的影响)

标签: c# winforms 64-bit


【解决方案1】:

解决方案是一种变通方法。我意识到我的目标是使用 32 位运行的可视化设计器,这样我就不必编写任何自己的代码。这是我所做的:

  1. WinForms 项目设置为 32 位。
  2. 创建了custom user control
  3. 在 32 位中构建项目。
  4. custom user control 拖放到设计图面上。
  5. 指定custom user control 的所有属性。 (颜色、尺寸、底座等)
  6. 声明一个Form_OnLoad() 方法。
  7. 将与我的自定义用户控件相关的设计器代码隐藏中所有自动生成的代码复制/粘贴到Form_OnLoad()
  8. 从与custom user control 相关的设计图面中删除所有设计元素。这将删除 custom user control 的设计器代码隐藏中自动生成的代码。
  9. 构建和测试:我看到custom user control了吗?是的..继续。
  10. 将 WinForms 项目的构建设置切换回 64 位。
  11. 构建和测试:我看到custom user control了吗?是的..执行数学函数...它是否可以毫无例外地工作?是的..继续

这种快速而肮脏的解决方法并不理想 - 但实施起来非常快。暂时将我的项目切换为 32 位以激活 Visual IDE 对这个项目来说“没什么大不了的”。

**** 编辑解决方案 ****

请勿进行上述操作。请参阅下面的 Hans 评论。

管理员:对于草率的帖子感到抱歉,请随时删除此帖子,因为我不知道这个问题和答案是否会帮助除我以外的其他人。

【讨论】:

  • 您肯定在追求错误的解决方案,问题是您的数学库也在设计模式下使用。并且死了,因为现在它以 32 位模式运行。您不想在设计模式下使用您的库,这是没有意义的。顺便说一句,在 Debug 构建中分配大量内存并没有多大意义。
  • 如果您的 GUI 代码在 32 位和 64 位中都运行良好,那么您可以通过添加另一个项目来简化开发过程:(1)“WinForms”可执行文件,64 位构建,仅包含 Program.cs (2) WinForms 类库 DLL,其中包含实际的 UI,AnyCPU 构建,(3) 数学类库 DLL,64 位构建。在这种情况下,UI DLL 应该同时加载到 32 位设计器和 64 位应用程序中,而无需再弄乱设置。
  • @Hans:你是绝对正确的。为了测试你的理论,我为我的数学库创建了接口。我将这些接口移至“模型”类库。然后,我从我的 winforms 项目中完全删除了 64 位数学库引用。然后我将 winforms 项目更改为“AnyCpu” - 并验证了正确的操作。没有错误。感谢汉斯的准确观察。
  • @Hans:我将使用整数作为索引 (52C5) 等从一副 52 张牌中发出的每五张牌进行置换,乘以标准视频扑克游戏中的支付类别数量.该对象图大小超过 32 位限制。好像我需要空间......而且有一点。
  • 只是不要把这样的信息排除在外,只有当你分享足够的细节时,你才会得到有用的答案。
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2017-04-11
  • 2010-09-13
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多