一直在這幾個小時,不能讓它工作:(的PInvoke返回浮點
下面的代碼提供了異常「嘗試讀取或寫入受保護的內存。這通常是指示其他內存腐敗。」這是固定的,請參閱下面的更新
,但是當我改變返回類型INT,並返回一個INT價值,它的工作原理。如何使它返回一個浮動值? 謝謝。
vs2012
C++代碼
extern "C" __declspec(dllexport)
float compute_similarity()
{
return 1.01;
}
C#代碼
[DllImport("demo.exe", EntryPoint = "compute_similarity", CallingConvention = CallingConvention.Cdecl)]
public static extern float compute_similarity();
public void Get()
{
float x = compute_similarity(); // here returns random value
}
======================= ==============
UPDATE
查看大衛下面的評論,問題是c#項目是針對x64,而C++針對的是Win32。將c#項目更改爲x86目標後,異常消失了。
不過從C#調用返回預期
你在64位機器上嗎?我只是想知道,如果C代碼是64位環境,是否會返回一個64位的「float」(即C#代碼的雙精度值)。 –
如果你明確地在C++的'float'和'compute_similarity'之間加了'__cdecl',它會起作用嗎? – dtb
@DavidArno非常感謝大衛,是的,c#項目是針對x64的,C++針對的是Win32,在將c#項目更改爲x86目標後,它使異常消失,儘管它仍然返回一些隨機值而不是1.01。更新了問題。 – Xin