使用“static extern int system(string str)”时的PInvokeStackImbalance

时间:2012-08-15 11:01:50

标签: c# msvcrt

我正在尝试将系统(string str)命令用于C#中的dos操作。

namespace XYZ
{
    internal class Program
    {
        [DllImport("msvcrt.dll")]
        static extern int system(string str);

        static void Main(string[] args)
        {
             string Command = Console.ReadLine();
             system(Command); 
             /* Excutes command, then "PInvokeStackImbalance". */
        }
    }
}

我知道使用static extern int system(string str)是一个糟糕的解决方案,但我尝试过其他不起作用的解决方案。

2 个答案:

答案 0 :(得分:3)

您忘了指定调用约定:

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int system(string str);

我通常会尝试解释原因,但这似乎没有必要;)否则这不太可能解决您的问题,无论它是什么,它都与

相同
Process.Start("cmd.exe", "/c " + str);

答案 1 :(得分:1)

一般来说,你的做法是错误的。此函数适用于基于C / C ++本机控制台的应用程序。在C#中,您拥有System.Diagnostic命名空间,您可以轻松地使用它来启动新进程。请看这里:C++ "system()" in C#

当然, 也可以使用该功能。可能因为DllImport短语不完整而调用异常,请参阅in .Net 4: PInvokeStackImbalance Exception此线程是关于strlen的,但我几乎可以肯定system()和strlen()使用相同的堆栈约定。