Сообщение Re[9]: [Offtop] Вызов принят! от 15.06.2016 8:41
Изменено 15.06.2016 9:20 Serginio1
Здравствуйте, Sinix, Вы писали:
S>Если человека устраивает, что ни в одном проекте подобный код не примут и даже читать не будут — зачем спорить?
Главное работает и мне понятно. Вопрос где могут быть еще подводные камни.
Наверняка найдутся в режиме эксплуатации.
Поэкспериментировал с CallBack
На С++
Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.
S>Если человека устраивает, что ни в одном проекте подобный код не примут и даже читать не будут — зачем спорить?
Главное работает и мне понятно. Вопрос где могут быть еще подводные камни.
Наверняка найдутся в режиме эксплуатации.
Поэкспериментировал с CallBack
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void myDelegate(IntPtr thisptr);
public static void TestCallBack(IntPtr Str,IntPtr FuncPtr)
{
myDelegate fun = (myDelegate)Marshal.GetDelegateForFunctionPointer<myDelegate>(FuncPtr);
fun(Str);
var str = Marshal.PtrToStringUni(Str);
}
На С++
typedef void(STDMETHODCALLTYPE *ManagedTestCallBack)(const wchar_t*, void(*) (const wchar_t*));
ManagedTestCallBack pTestCallBack;
hr = CreateDelegate2(pCLRRuntimeHost, domainId, L"CoreClrDLL", L"CoreClrDLL.Program", L"TestCallBack", (INT_PTR*)&pTestCallBack);
if (FAILED(hr))
{
printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);
}
else
{
wchar_t* str = L"Test str from unmanaged";
pTestCallBack(str, TestCallBack);
}
Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.
Здравствуйте, Sinix, Вы писали:
S>Если человека устраивает, что ни в одном проекте подобный код не примут и даже читать не будут — зачем спорить?
Главное работает и мне понятно. Вопрос где могут быть еще подводные камни.
Наверняка найдутся в режиме эксплуатации.
Поэкспериментировал с CallBack
На С++
Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.
S>Если человека устраивает, что ни в одном проекте подобный код не примут и даже читать не будут — зачем спорить?
Главное работает и мне понятно. Вопрос где могут быть еще подводные камни.
Наверняка найдутся в режиме эксплуатации.
Поэкспериментировал с CallBack
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void myDelegate(IntPtr thisptr);
public static void TestCallBack(IntPtr Str,IntPtr FuncPtr)
{
myDelegate fun = Marshal.GetDelegateForFunctionPointer<myDelegate>(FuncPtr);
fun(Str);
var str = Marshal.PtrToStringUni(Str);
}
На С++
typedef void(STDMETHODCALLTYPE *ManagedTestCallBack)(const wchar_t*, void(*) (const wchar_t*));
ManagedTestCallBack pTestCallBack;
hr = CreateDelegate2(pCLRRuntimeHost, domainId, L"CoreClrDLL", L"CoreClrDLL.Program", L"TestCallBack", (INT_PTR*)&pTestCallBack);
if (FAILED(hr))
{
printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);
}
else
{
wchar_t* str = L"Test str from unmanaged";
pTestCallBack(str, TestCallBack);
}
Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.