2013-10-10 3 views
0

Я действительно застрял здесь. Надеюсь, кто-то может мне помочь. Как перевести эту функцию на C#?Перевод с C/C++ на C#

void __declspec(dllexport) __cdecl test(float *avrSwap, int *aviFAIL, char *accInfile, char *avcOutname, char *avcMsg) 
+1

вы хотите назвать эту Си ++ в C#? – Matt

+0

Я не хочу скомпилировать его сначала i C++. Я хочу вызвать эквивалентную функцию C#. – user2855803

+0

создайте блок 'unsafe' и вызовите функцию. разве это не должно работать? –

ответ

0
[DllImport("dllname", CallingConvention=CallingConvention.Cdecl, EntryPoint="test")] 
private static void Test(
    [In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst=1024)] float[] avrSwap, 
    out int aviFAIL, 
    [In, MarshalAs(UnmanagedType.LPStr)] string accInfile, 
    [In, MarshalAs(UnmanagedType.LPStr)] string avcOutname, 
    [Out, MarshalAs(UnmanagedType.LPStr)], StringBuilder avcMsg 
); 

//Wrapper that correctly initializes the StringBuilder to its rightful size. 
//It's quite stupid that according to the P/Invoke help, 
//StringBuilder parameters don't support SizeConst. 
public static void WrapTest(float[] avrSwap, out int aviFAIL, string accInfile, string avcOutname, out string avcMsg) 
{ 
    StringBuilder sbAvcMsg = new StringBuilder(1024); 
    Test(avrSwap, out aviFail, accInfile, avcOutname, sbAvcMsg); 
    avcMsg = sbAvcMsg.ToString(); 
} 
+0

. Спасибо за ответ, однако, как «Я не хочу сначала скомпилировать его на C++. Я хочу назвать эквивалентную функцию C#». Причина этого в том, что в моем приложении функция C++ будет меняться во время выполнения. C# легко компилируется внутри во время выполнения, а C++ может (только?) Компилироваться во время выполнения с использованием msbuild.exe (и других). Однако решение, которое я ищу, является внутренним компилятором, и я не могу найти внутренний компилятор C++. – user2855803

+0

Тогда его параметры, вероятно, будут такими же, как 'WrapTest'. – Medinoc