shadow7256 wrote:то есть мой прототип должен выглядеть вот так?
Code: Select all
private static extern int DeserializePersonJob([MarshalAs(UnmanagedType.LPStr)] string strValidationFile,
[MarshalAs(UnmanagedType.LPStr)] string strPersonBuffer,
[MarshalAs(UnmanagedType.LPStr)]string strOutFile);
А тому человечку я так понял придется поменять параметры в его С++ функции на char* ?
Примерно так. Также если он добавит extern "C", то в качестве EntryPoint в C# выступает обычное название функции (non mangled).
Code: Select all
extern "C" int __declspec(dllexport) DeserializePersonJob(
const char* strValidationFile,
const char* strPersonBuffer,
const char* strOutFile )
{
}
Соответствующий C#:
Code: Select all
/// Return Type: int
///strValidationFile: char*
///strPersonBuffer: char*
///strOutFile: char*
[DllImportAttribute("BioSubSNFD.dll", EntryPoint="DeserializePersonJob")]
public static extern int DeserializePersonJob(
[In] [MarshalAs(UnmanagedType.LPStr)] string strValidationFile,
[In] [MarshalAs(UnmanagedType.LPStr)] string strPersonBuffer,
[In] [MarshalAs(UnmanagedType.LPStr)] string strOutFile
);
Одно замечание. Судя по именам параметров, они представляют собой имена файлов. По хорошему для этого нужно использовать Unicode.
Использовать Unicode для имен файлов или нет - это зависит от ваших требований.
Для использования Unicode в приведенном коде выше нужно заменить:
Code: Select all
const char* => const wchar_t*
UnmanagedType.LPStr => UnmanagedType.LPWStr
А также использовать соответствующие Unicode функции для работы с файлами в C++ коде.
----------
Облегчить задачу генерации PInvoke сигнатуры может PInvoke Interop Assistant:
https://clrinterop.codeplex.com/releases/view/14120
Используйте "SigImp Translate Snippet" tab для перевода деклараций С++ в C#.
Используйте "SigImp Search" tab для генерации PInvoke для стандартных Windows функций, типов и констант.