【问题标题】:Running a program with System.Diagnostics.Process.Start causes a MissingMethodException使用 System.Diagnostics.Process.Start 运行程序会导致 MissingMethodException
【发布时间】:2011-03-31 15:13:20
【问题描述】:

我正在开发一个 Compact Framework 2.0 项目,我正在尝试使用 Process.Start 从另一个程序“A”中启动一个程序“B”。我以前做过几次,但这次我遇到了一些奇怪的问题。

程序“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”都使用程序“B”未加载的.dll。如果两个程序不能同时加载相同的 .dll,那就是问题所在。是这样吗?

【问题讨论】:

  • 如果直接启动B程序会怎样?我的意思是双击它.. 编辑:对不起,我错过了问题中的一些行:D

标签: c# compact-framework system.diagnostics process.start


【解决方案1】:

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

【讨论】:

  • 内存似乎足够了,我现在认为这可能是我添加到原始答案中的问题。难道是我不能两次加载同一个.dll?
  • 他们没有理由不能使用同一个程序集。他们每个人都会加载自己的副本(除非它是 GACed)。它们都必须被编译为使用相同版本的 DLL(或者有一个应用程序配置条目告诉 htem 他们可以加载存在的那个)。
  • 它们都应该被编译为运行相同的版本,因为它们在同一个解决方案上,并且引用被添加到同一个解决方案上的项目中。我怎么能告诉程序加载任何版本?谢谢
【解决方案2】:

我通过在程序 B 的程序集中复制引用的代码并删除所有引用来使它工作。它远非优雅,但我无法让它以任何其他方式工作。如果有人知道可能出了什么问题,我将不胜感激。它可能会在其他时候派上用场。谢谢

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多