Hy vọng đây là một câu hỏi dễ dàng, nhưng nó cho thấy sự thiếu chuyên môn của tôi với C++. Tôi là một lập trình viên C#, và tôi đã thực hiện công việc mở rộng với P/Invoke trong quá khứ với các tập tin C++/C của người khác. Tuy nhiên, thời gian này tôi đã quyết định viết một wrapper C + + dll (unmanaged) bản thân mình, và sau đó gọi dll wrapper của tôi từ C#.Làm thế nào để thiết lập một hàm C++ sao cho nó có thể được sử dụng bởi p/invoke?
Sự cố tôi ngay lập tức gặp phải là tôi không thể xác định hàm C++ có thể được tìm thấy bằng lệnh p/invoke. Tôi không biết những gì các cú pháp cho việc này, nhưng đây là những gì tôi đang cố gắng cho đến nay:
extern bool __cdecl TestFunc()
{
return true;
}
Ban đầu tôi chỉ đơn giản là có này, nhưng nó đã không làm việc một trong hai:
bool TestFunc()
{
return true;
}
Và sau đó trên C# bên, tôi có:
public const string InterfaceLibrary = @"Plugins\TestDLL.dll";
[DllImport(InterfaceLibrary, CallingConvention = CallingConvention.Cdecl,
EntryPoint = "TestFunc"), SuppressUnmanagedCodeSecurity]
internal static extern bool TestFunc();
Tất cả mọi thứ biên dịch, nhưng khi tôi thực hiện điều này C# p/gọi cuộc gọi, tôi nhận được một System.EntryPointNotFoundException: Không thể tìm thấy một điểm vào tên 'TestFunc' trong DLL ' Plugins \ TestDLL.dll '.
Chắc chắn đây phải là điều cực kỳ đơn giản trên đầu C++ mà tôi không biết cú pháp.
Tuyệt vời, điều đó đã làm được! Tôi cũng đã cố gắng chỉ có bên ngoài "C" trong quá khứ, nhưng điều đó đã không làm việc. Nó không thành công cho đến khi _declspec (dllexport) được thêm vào. – x4000