簡體   English   中英

將SWIG與C#一起使用時的最佳做法是什么?

[英]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.

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