日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C++代码封装成dll供C#中调用、调用dll无可用源

發布時間:2023/12/14 C# 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++代码封装成dll供C#中调用、调用dll无可用源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C#工程不可以直接調用C++的頭文件和Lib庫等

所以在程序中C#需要調用的現象,先將C++的東西封裝成動態鏈接庫,再調用

若調用dll時顯示:無可用源調用,說明導入的DLL路徑不對。

靜態庫和動態庫區別:

靜態庫和動態庫是兩種共享程序代碼的方式,它們的區別是:靜態庫在程序的鏈接階段被復制到了程序中,和程序運行的時候沒有關系;動態庫在鏈接階段沒有被復制到程序中,而是程序在運行時由系統動態加載到內存中供程序調用。使用動態庫的優點是系統只需載入一次動態庫,不同的程序可以得到內存中相同的動態庫的副本,因此節省了很多內存

debug模式與release模式

編譯.EXE 應用程序有兩種模式:Debug和Release,其中,D模式下表示調試,生成的exe文件中包含了調試信息的接口,R模式下是發行版exe程序,生成的exe文件不包含調試信息,程序經過優化,效率高內存小;所以在移植到其他的電腦上使用時,優先考慮使用Release模式生成.exe文件;

托管和非托管

C++是非托管代碼,C#是托管代碼,若C#要調用C++的話,需要將C#代碼封裝成托管代碼,編譯成dll才可以使用。

托管代碼 (managed code) :由公共語言運行庫環境(cls而不是直接由操作系統)執行的代碼。托管代碼應用程序可以獲得公共語言運行庫服務,例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務幫助提供獨立于平臺和語言的、統一的托管代碼應用程序行為。
非托管代碼 (Unmanaged Code) :在公共語言運行庫(cls)環境的外部,由操作系統直接執行的代碼。非托管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務;它與托管代碼不同,后者從公共語言運行庫中獲得這些服務。非托管代碼的英文名是Unmanaged Code ,它是在公共語言運行庫環境的外部,由操作系統直接執行的代碼。

托管申請的資源由.netframework統一管理,非托管申請的內存資源需要手動釋放。 非托管運行很快,二進制

托管類clr類。

C++動態鏈接庫的建立

  • 新建WIN32控制臺程序
  • 應用程序選dll,附加項目選導出符號,代碼中會包含一個導出變量和導出函數 導出類的實例,對應的.h文件也會創建相應的導出操作。
  • 預編譯頭作用:VS默認情況下會創建并使用預編譯頭文件(即自動創建StdAfx.h和StdAfx.cpp),以便在編譯時加快編譯速度,預編譯器將它編譯后,會生成一個Precompiled header,即pch文件,這樣下次就可以直接使用這個已經編譯好的代碼。
  • 生成的dll的.h文件中:?下列 ifdef 塊是創建使從 DLL 導出更簡單的宏的標準方法。此 DLL 中的所有文件都是用命令行上定義的 DFUSOURCE_EXPORTS符號編譯的。在使用此 DLL 的?任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將DFUSOURCE_API 函數視為是從 DLL 導入的,而此 DLL 則將用此宏定義的符號視為是被導出的?!?span style="color:rgb(51,204,0)">DFUSOURCE】是本項目的名稱。
  • .h中:EXTERN_C DFUSOURCE_API int fnDFUSource(void); ? .cpp中定義:DFUSOURCE_API int fnDFUSource(void){ ? ?return 42;}, 添加EXTERN_C ,已C語言函數名導出可以保證導出的函數名不變。
  • C++代碼中引用dll文件和Lib庫,其中包括:a 包含附加目錄。
  • 1 新建dll文件
    2 自動生成的實例
    3 生成解決方案,debug中
    4 引用dll文件和Lib庫文件 包含附加目錄include
    包含附加庫目錄
    添加: lib庫



    C#中調用C++的動態鏈接庫
  • 創建C#中的WPF
  • 在MainWindow.xaml.cs中導入要引用的dll相關信息,就可以直接使用?fnDFUSource(); 添加包括 ?/*DllImport*/
    using System.Runtime.InteropServices;
    [DllImport(@"E:\language\C#\DFUSource\Debug\DFUSource.dll", EntryPoint = "fnDFUSource")]
    extern static int fnDFUSource();
  • 其他類似


  • 打印wchar_t,使用printf("%s")只能打印首字母,使用printf("%ls")可以將字符全部打印。


    總結

    以上是生活随笔為你收集整理的C++代码封装成dll供C#中调用、调用dll无可用源的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。