[英]What are the best practices when using SWIG with C#?
有沒有人在那里使用帶有C#的SWIG庫? 如果你有,你找到了什么陷阱以及使用該庫的最佳方式是什么? 我正在考慮將它用作用C編寫的程序的包裝器,我想將頭文件包裝在我可以在我的.NET應用程序中使用它們。
編輯:對目標操作系統的一些澄清。我計划在Linux和Windows上運行應用程序,因此我正在研究SWIG。 P / Invoke不是一個選項。
對於我的上一個項目,這是整個C#SWIG配置文件:
%module mdProject
%{
#include "mdProject.h"
%}
我在SWIG編譯它:
swig -csharp -c++ -I../../Include mdProject.i
這生成了一個Project.cxx,我編譯並直接鏈接到'main'DLL,所以我不需要第二個C ++'helper'DLL。 SWIG還生成了一堆C#文件,我將其編譯成.NET DLL。 我的其他包裝器(Java,PHP等)確實使用了輔助DLL。
正如@patrick所提到的,SWIG使用P / Invoke,所以如果你遇到問題,你需要找到另一個解決方案。
如果你使用偏離普通類型(空洞,結構等)的類型,你將不得不做一些額外的工作來使它正確,但對於使用int,char *等的普通API,它沒關系。
我認為早期海報所犯的錯誤是閱讀文檔而不是看例子。
幾個小時前,我需要將一些C ++類與C#接口。 我查看了我的Swig目錄(我已將其用於其他工作),找到目錄Examples/csharp/class
,瀏覽代碼,加載解決方案,grokked它,復制它,放入我的代碼,它工作,我的工作是完成。
話雖如此,生成的P / Invoke代碼並不是滿足所有需求的解決方案。 根據您的項目,自己編寫一些簡單的API包裝器或編寫托管C ++可能同樣簡單(查找SlimDX以獲得極好的示例)。
根據我的需要,它簡單易行 - 我有mystuff.dll
,現在另外我可以發送mystuffnet.dll
。 我同意該文檔很難進入。
編輯:我注意到OP只提到了C.為此,你真的不需要Swig,只需使用通常的C#/ C DLLImport互操作語法 。 當您想要從C#調用C ++類時,Swig會很有用。
幾年前,我確實嘗試使用SWIG包裝項目C ++,以便在.NET中使用。
我沒有走得太遠,因為產生SWIG所需的配置是一個巨大的巨大痛苦。 當時我只想要一個解決方案,而不是學習另一種語言/ api /等。 這些天SWIG可能更容易使用,我無法告訴你。
我們最終使用托管C ++來包裝C ++項目。 它運作得很好。
如果您只是直接從dll調用函數,我建議不要擔心上述任何一個,只是使用P / Invoke
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.