2016-02-19 192 views
-1

我有一个解决方案两个项目:如何设置引用64位类库的32位winform解决方案?

MyWinForm - 自定义用户32位的项目控制

MyClassLibrary - 一个64位的项目,需要64位的数学运算

我由微软“强制”生成32位程序集的用户控件。 See here for reference

我被我的数学模型“强迫”要求64位数学运算。

如果我在MyWinForm内引用MyClassLibrary并将其保持为64位程序集,那么我的数学运算就会成功完成;但是,我不能再使用自定义用户控件。当我试图将我的自定义用户控件拖放到设计器表面时,出现以下错误:“未能加载工具箱项目,它将被删除”。

如果我引用内MyWinFormMyClassLibrary并保持它作为一个32位的组件,然后我的数学操作失败,出现一个OutOfMemory例外(由于32位最大大小限制)。

如何设置我的解决方案以允许引用自定义用户控件和64位类库以避免这些问题?

我真的很想能够使用工具箱和设计曲面。我有一种预感,我将需要在运行时加载自定义用户控件,以便动态编译器知道如何决定32位或64位。在我看来,这违背了使用Visual IDE的目的。

+0

您不能在32b进程中使用64b库,因为库已加载到进程空间,因此必须是32b – Gusman

+0

是否有解决方法? – sapbucket

+1

好吧,首先不是任何直接的,但是你可以创建两个单独的进程,一个用于32b GUI,另一个用64b数学类并且用tcp/pipes/shared memory进行相互通信,你可以启动32b,启动一个不可见的过程,然后你可以混合的东西。一个提示,堆栈溢出发生,因为没有堆栈,你是否试图在32b进程中增加堆栈大小? – Gusman

回答

0

该解决方案是一种解决方法。我意识到我的目标是使用可视化设计器,它运行在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? yes..proceed。
  10. 将构建设置切换回64位WinForms项目。
  11. 建立和测试:我看到custom user control? yes..execute数学函数...它没有任何例外的工作吗?是..继续

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

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

不要这样做。相反,请看下面的汉斯评论

管理员:抱歉,马虎邮政,随时删除这个,因为我不知道这个问题和答案是否会帮助其他人,但我。

+0

当然,您正在追逐错误的解决方案,问题在于您的数学库也在设计模式中使用。并且因为它现在运行在32位模式下而死亡。你不想在设计模式下使用你的库,这是没有意义的。在调试构建中分配大量内存时没有太多意义。 –

+0

如果您的GUI代码在32位和64位上运行良好,那么您可以通过添加另一个项目来简化开发过程:(1)“WinForms”可执行文件(64位版本)仅包含Program.cs(2 )包含实际UI,AnyCPU构建的WinForms类库DLL,(3)数学类库DLL,64位构建。在这种情况下,UI DLL应该加载到32位设计人员和64位应用程序中,而不必再次混淆设置。 –

+0

@Hans:你绝对正确。为了测试你的理论,我为我的数学库创建了接口。我将这些接口移动到了“模型”类库。然后我从winforms项目中完全删除了64位数学库引用。然后,我将winforms项目更改为“AnyCpu” - 并验证了正确的操作。没有错误。感谢汉斯的准确观察。 – sapbucket