簡體   English   中英

通過PInvoke“Hello World”

[英]“Hello World” via PInvoke

我正在嘗試在C#中創建一些需要調用一些非托管DLL的東西,這個過程對我一無所知! 我發現了一個“Hello World”教程 ,應該像從底部復制和粘貼幾行代碼一樣簡單:

using System;
using System.Runtime.InteropServices;

namespace PInvokeTest
{
    class Program
    {
        [DllImport("msvcrt40.dll")]
        public static extern int printf(string format, __arglist);

        public static void Main()
        {
            printf("Hello %s!\n", __arglist("World"));
            Console.ReadKey();
        }
    }
}

這會編譯並運行完成而不會出現任何錯誤,但是到達ReadKey()時不會打印任何內容。

我錯過了一些重要的設置步驟嗎? 該項目是為.NET 4.6.1構建的(如果對DLL版本控制很重要)。

你正在使用的msvcrt*版本可能就是問題所在。 如果我使用未修改的代碼創建一個控制台應用程序,我會得到相同的結果 - 沒有輸出。

如果我將引用的dll從msvcrt40.dllmsvcr120.dll那么我會看到預期的輸出。

[DllImport("msvcr120.dll")]
public static extern int printf(string format, __arglist);

public static void Main()
{
    printf("Hello %s!\n", __arglist("World"));
    Console.ReadKey();
}

附加信息

msvcrt*的各種編號版本跟蹤Visual Studio的版本:

  • MSVCRT70.DLL Visual Studio .NET
  • MSVCRT71.DLL Visual Studio 2003
  • MSVCRT80.DLL Visual Studio 2005
  • MSVCRT90.DLL Visual Studio 2008
  • MSVCRT100.DLL Visual Studio 2010
  • MSVCRT110.DLL Visual Studio 2012
  • MSVCRT120.DLL Visual Studio 2013

這種版本編號方法在VS2015中發生了變化,這是由於這造成了混亂和脆弱的依賴鏈。 有關這些更改的更多信息,請訪問:

偉大的CRT重構

介紹通用CRT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM