Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Решение найдено 05.06.09 12:18 Число просмотров: 2603
Автор: PS <PS> Статус: Elderman Отредактировано 05.06.09 12:25 Количество правок: 2
|
> Насколько я помню у дотнета перемещающий GC > (http://en.wikipedia.org/wiki/Generational_GC#Moving_vs._no > n-moving) и соответственно "указатель" на объект > многократно меняется по ходу выполнения программы. В MC++ > есть pin_ptr, который запрещает перемещать данный объект. В > шарпе для этих целей есть fixed > http://msdn.microsoft.com/en-us/library/f58wzh21(VS.80).asp > x
Идея задачи была такой: не использовать unsafe код, и в то же время дергать dll с указателями.
Получилось вот такое:
struct ST
{
public IntPtr ptr;
public int t;
};
class Program
{
[DllImport("dllForSharp.dll")]
public static extern int Test(ref ST param, IntPtr param2);
static void Main(string[] args)
{
string test = "kuku";
byte[] b = System.Text.ASCIIEncoding.Default.GetBytes(test);
ST st;
st.ptr = Marshal.UnsafeAddrOfPinnedArrayElement(b, 0);
st.t = 105;
Test(ref st, st.ptr);
}
---
Разницы между первоначальным не работающим вариантом и этим:
1. byte[] заменен на IntPtr
2. Появилась "лишняя" операция
Marshal.UnsafeAddrOfPinnedArrayElement(b, 0);
|
|
|