Tôi có tiêu đề chức năng sau đây trong một DLL bản địa:soái một unsigned char * chức năng trở về từ một dll, trong C#
unsigned char* Version_String()
Tôi đang cố gắng gọi nó từ một dự án C#, tôi đã cố gắng cuộc gọi sau (như được tìm thấy trên những câu hỏi tương tự khác ở đây):
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
public extern static UIntPtr Version_String();
Và tôi tiếp tục nhận được ngoại lệ sau đây:
cố gắng để đọc hoặc viết Prot bộ nhớ ected. Đây thường là dấu hiệu cho thấy rằng bộ nhớ khác bị hỏng.
Các thử tiếp theo là sau đây và tôi nhận được cùng một ngoại lệ:
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
[return : MarshalAs(UnmanagedType.LPStr)]
public extern static string Version_String();
tôi dường như không thể để có được xung quanh vấn đề này. Mọi sự trợ giúp sẽ rất được trân trọng!
Edit: vẻ
tôi không thể cung cấp cho mã DLL đây, do được xếp vào một NDA, nhưng chức năng tôi gọi như thế này:
unsigned char versionString[50];
__declspec(dllexport) unsigned char* Version_String()
{
if(check_hardware_stuff())
{
strcpy((char *) versionString, "version_string_bla_bla");
versionString[5] = stuff;
}
else if (other_check())
{
//will return empty string, that should be filled with '\0'
}
else
{
strcpy((char *) versionString, "ERROR");
}
return versionString;
}
Tôi không đặc biệt thích việc thực hiện DLL, nhưng tôi cần phải sử dụng nó "vì nó là". Tôi bị loại trừ bất cứ khi nào tôi cố gắng gọi VersionString()
, bất kể tôi làm gì với giá trị trả lại.
Có thể bạn đang sử dụng sai [quy ước gọi điện] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx)? – svick
Dll của bạn có được biên dịch với tùy chọn bộ ký tự MultiByte không? –
Sử dụng trình gỡ rối để tìm ra nơi mã gốc bị treo. Project + Properties, Debug, đánh dấu chọn "Enable unmanaged code debugging". Đặt điểm ngắt trên hàm trong tệp mã nguồn C. –