【问题标题】:in .Net 4: PInvokeStackImbalance Exception在 .Net 4 中:PInvokeStackImbalance 异常
【发布时间】:2010-04-27 16:29:09
【问题描述】:

我在 .Net 3.5 项目中使用来自 msvcrt.dllstrlen 函数。更具体地说:

private unsafe static extern int strlen( byte *pByte );

迁移到 .NET 4.0 后,如果我使用此函数,它会引发 PInvokeStackImbalance 异常。

如何导入 .NET 3.5 msvcrt.dll 或修复此异常?

【问题讨论】:

    标签: c# .net .net-4.0 msvcrt


    【解决方案1】:

    我怀疑问题出在调用约定上,您应该使用 Cdecl。

    [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
    private unsafe static extern int strlen(byte* pByte);
    

    【讨论】:

    • +1 我今天在工作中遇到了同样的问题,而您的解决方案正是我所需要的。谢谢。
    【解决方案2】:

    这并不是一个真正的直接答案,但似乎对于这种功能,最好自己编写。例如,以下 C# 代码可能会工作(尽管可能有一个使用现有函数的衬里也可以工作):

      static int mystrlen( byte[] pbyte )
         {
         int i = 0;
         while ( pbyte[i] != 0 )
            i++;
         return i;
         }
    

    【讨论】:

      【解决方案3】:

      从 .NET 3.5 到 4 不应该有任何变化。(顺便说一句,msvcrt.dll 不是框架的一部分 - 它是 Microsft C++ 运行时库)。您确定您的项目中没有其他任何变化吗?

      我刚刚尝试了这段代码,它可以正常工作并按预期打印“4”:

      class Test
      {
          public unsafe static void Main(string[] args)
          {
              byte[] bytes = new byte[] {70, 40, 30, 51, 0};
              fixed(byte* ptr = bytes)
              {
                  int len = strlen(ptr);
                  Console.WriteLine(len);
              }
          }
          [DllImport("msvcrt.dll")]
          private unsafe static extern int strlen(byte* pByte);       
      }
      

      我不清楚你为什么要从托管代码中调用 strlen,但当然你可能有你的理由。如果您需要替代的托管实现,可以使用以下方法:

      private static int managed_strlen(byte[] bytes)
      {
          return bytes.TakeWhile(b => b != 0).Count();
      }
      

      当然这不处理多字节(unicode)字符,但我不认为 strlen 也可以。

      【讨论】:

      • 您好 Driis,感谢您的回复。我在不安全的代码中使用它,我忘了提及它。我忘记了 @ChrisTaylor 的 CallingConvention 属性:P
      【解决方案4】:

      只是为了好玩:

      public static unsafe int strlen(void* buffer)
      {
          byte* end = (byte*)buffer;
          while (*end++ != 0);
          return(int)end - (int)buffer - 1;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2023-03-21
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        相关资源
        最近更新 更多