PDA

View Full Version : چجوری با اشاره گر ، یه آرایه ی Unmanaged رو توی سی شارپ بخونم و بنویسم؟



SajjadKhati
یک شنبه 01 اسفند 1395, 15:44 عصر
سلام
میخوام با زبان Lua ، یه آرایه ای رو به dll سی شارپ که خروجی Unmanaged Export داره رو بفرستم . لوا نمیتونه بصورت مستقیم ، برای سی شارپ آرایه ارسال کنه
نمیدونم ساختار آرایه در لوا چجوری هه ولی چون لوا با زبان C نوشته شد و از طرفی هم فقط میتونه با خروجی هایی از نوع Unmanaged Export با سی شارپ ، ارتباط برقرار کنه ، برای همین حدس میزنم به احتمال زیاد ساختار زبانش باید Unmanaged باشه

حالا مشکل اینجاست که من اشاره گر به آرایه ای که در لوا ساختم رو برای سی شارپ میفرستم (با استفاده از خود همون اشاره گر ، در لوا میتونم اعضای آرایه رو بخونم) و آدرس اشاره گر هم به درستی به سی شارپ فرستاده میشه اما وقتی میخوام اطلاعات اون اشاره گر به آرایه رو در سی شارپ بخونم ، اطلاعات همون آرایه نیست و یه اطلاعات پرت و پلای دیگه هست .

باید چی کار کنم؟
کدی که برای قضیه ی بالا تست کردم و اطلاعات غلط رو میخونه ، اینه :

در Lua (که فقط اشاره گر به آرایه و تعداد اعضای آرایه رو برای سی شارپ میفرسته . کار خاصی نمیکنه) :



myArray = {164, 10, 41, 57, 2500, 1};


tableSize = MemoryEx.TableRequiredSize(myArray);
handleMyArray = MemoryEx.AllocateEx(tableSize);
handleMyArray:SetArrayType(MEMEX_ARR_INT); --say konid ghabl az meghdar dadn ba tabeh MemoryEx.Table , data type ro moshakhas konid
myArrayPointer = handleMyArray:GetPointer();
isCreatedInBuffer = MemoryEx.Table(myArrayPointer, myArray);
if (isCreatedInBuffer == true and myArrayPointer ~= nil) then
myArrayInBuffer = MemoryEx.Table(myArrayPointer);
if (myArrayInBuffer ~= nil) then
dllPath = _SourceFolder.."\\ClassLibrary2.dll";
dllHdl = Library.Load(dllPath);
if (dllHdl ~= nil) then
---------------------
firstElementInDll = dllHdl.ArrayPointer8(myArrayPointer, #myArrayInBuffer);
dllHdl:Close_();
end
end
end




و کدهای سی شارپ :



[DllExport("ArrayPointer8", CallingConvention.StdCall)]
public static unsafe void ArrayPointer8(int arrayPtr, int arrayLength)
{
int* mainPointer = (int*)arrayPtr;
for (int i = 0; i < arrayLength; i++)
{
MessageBox.Show(mainPointer[i].ToString(), "In C#");
mainPointer[i] = i;
}

}



-----------------------
بقیه ی کدهای سی شارپی که ازش نتیجه نگرفتم (کلاس Marshal) :



[DllExport("ArrayPointer4", CallingConvention.StdCall)]
public static int ArrayPointer4(int arrayPtr, int arrayLength)
{
try
{
IntPtr realArrayptr = (IntPtr)arrayPtr;
int[] arrayInC = new int[arrayLength];
Marshal.Copy(realArrayptr, arrayInC, 0, arrayLength);
MessageBox.Show(arrayInC[0].ToString(), "in c#");


return arrayInC[0];
}
catch (Exception)
{
return 0;
}
}


باید چی کار کنم؟
ممنون