我想在c#應用程序中使用c dll中的函數,每當我嘗試運行應用程序並調用有問題的函數時,我都會遇到此錯誤。
起初我想也許這是因爲我使用了錯誤的簽名,但我試圖儘可能簡單但沒有運氣。
爲了削減長話短說:
這是我的C DLL實際的源代碼:方法的類型簽名不是PInvoke兼容
#include <stdio.h>
#include <string.h>
extern "C"
{
struct teststruct
{
char acharacter;
int anumber;
char* astring;
char anarray[10];
const char* conststring;
};
__declspec(dllexport) teststruct TestDLL()
{
teststruct stc;
stc.acharacter = 'A';
stc.anumber = 10;
strcpy(stc.anarray, "Test");
stc.astring = "astring!";
stc.conststring = "Crash?";
return stc;
}
}
這是C#櫃檯部分:
[StructLayout(LayoutKind.Sequential)]
public struct teststruct
{
public char acharacter;
public int anumber;
[MarshalAs(UnmanagedType.LPStr)]
public string astring;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] anarray;
[MarshalAs(UnmanagedType.LPStr)]
public string conststring;
}
namespace Tcp_connections_list
{
public partial class Form1 : Form
{
[DllImport("simple c dll.dll",CallingConvention= CallingConvention.Cdecl)]
public static extern teststruct TestDLL();
public Form1()
{
InitializeComponent();
}
private void btnTestDll_Click(object sender, EventArgs e)
{
teststruct test = TestDLL(); //Crash at the very begining!
textBox1.Text = test.acharacter.ToString();
textBox1.Text = test.anarray.ToString();
textBox1.Text = test.anumber.ToString();
textBox1.Text = test.astring.ToString();
textBox1.Text = test.conststring.ToString();
}
}
}
下面的代碼片段給我完全相同的錯誤,我改變結構,以
struct teststruct
{
char acharacter;
int anumber;
};
及其C#相當於
[StructLayout(LayoutKind.Sequential)]
public struct teststruct
{
public char acharacter;
public int anumber;
}
使其儘可能簡單,但我再次得到相同的確切的錯誤!
我在這裏錯過了什麼?
FWIW您的非託管代碼是C++而不是C –
爲什麼是C++?它只使用c頭文件和c語句加上它的外部塊! – Breeze
這是C++。我可以告訴你,因爲你使用'extern「C」'這是無效的C.更重要的是,你把這個結構稱爲'teststruct',它在C中是無效的。在C中它將是'struct teststruct',或者你必須添加一個'typedef'。 –