簡體   English   中英

使用P / Invoke從C#調用C函數

[英]invoke C function from C# using P/Invoke

我有一個C函數,它是VS 2010項目的一部分,並具有以下簽名:

real_T wrapper(void)

哪里

typedef double real_T;

在我的C#代碼中,我嘗試這樣做:

[DllImport(@"C:\Users\bla\Documents\Visual Studio 2010\Projects\bla\bla\Debug\bladibla.dll")]
public static extern double wrapper();

static void Main(string[] args)
{
    wrapper();
}

但得到:

無法在DLL'C:\\ Users \\ bla \\ Documents \\ Visual Studio 2010 \\ Projects \\ bla \\ bla \\ Debug \\ bladibla.dll'中找到名為'wrapper'的入口點。

dll肯定在那里。 還有什么可能是錯的?

可能該函數正在以錯誤的名稱導出。 你可以像這樣壓制破壞:

extern "C" {
    real_T wrapper(void);
}

您顯然也沒有導出該功能。 這樣做的簡單方法是這樣的:

extern "C" {
    __declspec(dllexport) real_T wrapper(void);
}

如果仍然無法解決丟失的導出,請使用Dependency Walker之類的工具檢查該函數是否實際上正在導出,如果是,則以什么名稱導出。

最后,您應該將C#端的調用約定聲明為cdecl,以匹配本機函數的調用約定。

[DllImport(@"...", CallingConvention=CallingConvention.Cdecl)]
public static extern double wrapper();

暫無
暫無

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

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