2010-08-18 30 views
2

我正在致力于Compact Framework 2.0项目,并且正在尝试使用Process在另一个程序“A”中启动程序“B”。开始。我以前做过几次,但这次我遇到了一些奇怪的问题。使用System.Diagnostics.Process.Start运行程序会导致MissingMethodException

程序“B”确实启动,但它会导致MissingMethodException,基本上告诉我它缺少它引用的某个程序集。问题是程序集.dll就在那里,与程序“B”在同一个文件夹中。如果我双击程序“B”,它将正确运行且没有MissingMethodException,只有在程序“A”中的Process.Start启动时才会发生此问题。我完全不知道这里发生了什么。我试图设置WorkingDirectory属性没有运气。有关为什么程序在通过Process.Start执行时无法加载其引用的任何想法?由于

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      ProcessStartInfo startInfo = new ProcessStartInfo(programBFullPath, "argument"); 

      //I've been changing these two properties, have tried shell execute with both false and true, tried setting working directory and not setting it also 
      startInfo.UseShellExecute = false; 
      startInfo.WorkingDirectory = programBDirectory; 

      proc.StartInfo = startInfo; 
      proc.Start(); 

编辑我只是想的东西......这两个程序“A”和节目“B”使用的.dll程序“B”没有加载。如果两个程序无法同时加载相同的.dll,那就是问题所在。是这样吗?

+0

如果直接启动B程序会发生什么?我的意思是双击它.. 编辑:对不起,我错过了问题中的一些行:D – munissor 2010-08-18 15:28:34

回答

1

好吧,我通过复制程序B的程序集上的引用代码并删除所有引用来实现它。它远非优雅,但我无法以其他方式运作。如果任何人有任何可能出错的想法,我将不胜感激。它可能在其他时间派上用场。谢谢

1

设备上的内存压力如何?如果程序B依赖于程序集C,但没有足够的内存(虚拟或物理)来加载程序集C,那么你将得到一个MissingMethodException(而不是OutOfMemoryException,我一直认为这会更有意义)。

+0

内存似乎够了,我现在想这可能是我添加到我原来的答案的问题。难道是我无法加载相同的.dll两次? – JayPea 2010-08-18 15:43:38

+0

他们没有理由不能使用相同的组件。他们将分别加载自己的副本(除非是GAC)。它们必须被编译为使用相同版本的DLL(或者有一个应用程序配置条目,告诉它们可以加载存在的)。 – ctacke 2010-08-18 15:59:30

+0

它们应该被编译为运行相同的版本,因为它们在相同的解决方案上,并且参考被添加到同一解决方案中的项目。我怎么能告诉程序加载任何版本?谢谢 – JayPea 2010-08-18 16:09:51

相关问题