2016-04-23 86 views
0

因此,有我的C代碼:調用C#方法

__declspec(dllexport) int ExecuteC(int number, int (*f)(int)) { 
    return f(number); 
} 

它編譯成 'Zad3DLL.dll' 文件。

有我的C#代碼:

class Program 
{ 
    static int IsPrimeCs(int n) 
    { 
     for(int i = 2; i < n; i++) 
     { 
      if (n % i == 0) return 0; 
     } 
     return 1; 
    } 

    [UnmanagedFunctionPointer(CallingConvention.StdCall)] 
    public delegate int FDelegate(int n); 

    [DllImport("Zad3DLL.dll", EntryPoint = "ExecuteC")] 
    static extern int ExecuteC(int n, FDelegate fd); 

    static void Main(string[] args) 
    { 
     string s; 
     FDelegate fd = new FDelegate(IsPrimeCs); 
     while ((s = Console.ReadLine()) != null) 
     { 
      int i = Int32.Parse(s); 
      int res = ExecuteC(i, fd); 
      Console.WriteLine(res == 0 ? "Nie" : "Tak"); 
     } 
    } 
} 

問題是,當C#程序的執行來點,當它被調用函數Exec​​uteC它只是執行結束後沒有任何錯誤。我只是在Visual Studio的Output窗口中獲得zad3.vshost.exe' has exited with code 1073741855。我究竟做錯了什麼?

BTW不要告訴我,我可以搜索質數更efficently,它只是示例代碼:P

+0

向您的代碼添加異常處理程序。在終止程序的ExecuteC()方法中發生異常。由於main()中沒有異常處理函數,所以在調用main之前,Net Library添加到項目中的默認異常處理函數是處理異常並退出。當託管代碼發生異常時,編譯器會插入代碼來搜索執行堆棧並查找第一個異常處理程序。如果在方法中找不到異常處理程序,那麼在您的情況下WriteLine()函數會跳過父代方法。 – jdweng

+0

標題是否與預期相反?我認爲你正試圖從C#中調用C方法。 –

+0

@MathuSumMut好吧,它很複雜。我試圖調用C函數調用C#方法:P – Octothorp

回答

1

我心裏有兩個選擇:

  1. 檢查您的構建設置x86或x64爲這兩個項目。
  2. 驗證調用約定。我認爲在VC++中默認是cdecl,sou試着在DllImport屬性以及委託聲明中指定。
+0

是的,我指定Cdecl委託和DllImport現在它的作品,謝謝! :) – Octothorp