Можно ли изменить адрес памяти объекта в С#? Пример того, что я хочу:
unsafe public Program {
public struct Foo
{
int a;
int b;
}
static void Main(string[] args){
Foo foo= new Foo();
fixed(Foo *foo_ptr=&foo) //I know I can get the object pointer here.
Foo foo2= new Foo();
fixed(&foo2=foo_ptr) //How I can do this?
}
}
Я получил эту ошибку, когда попробовал последний fixed:
You can only take the address of an unfixed expression inside of a fixed statement initializer csharp(CS0212)
Кто-нибудь может мне помочь? Спасибо.
Редактировать:
Есть длинная история, почему я хочу изменить адрес памяти, а не просто написать это foo2=foo; . Вот я и спрашиваю, можно или нет? Этот пост не то, о чем я спрашиваю
Отвечает ли это на ваш вопрос? C# изменить адрес памяти переменной
Спасибо за ваш комментарий. Я написал пример, но есть важная причина, по которой я хочу изменить адрес памяти. Причина в том, что я использую указатель из C++ (общая библиотека). Указатель С++ указывает на объект в другом процессе С++, и я хочу, чтобы оба объекта указывали на один и тот же адрес общей памяти. Вот почему я хочу изменить адрес памяти объекта С#.
@MagnusZaza Я до сих пор не совсем понимаю, что ты хочешь сделать. Если у вас есть указатель на объект в другом процессе, что делает создание нового объекта в вашем процессе, а затем изменение его адреса на адрес другого объекта? Почему бы просто не использовать указатель, который вы получили?
Привет. Сделать это будет непросто. Потому что в .Net GC должен отслеживать адреса всех переменных, чтобы отменить выделение указателя после освобождения последней привязки переменной. Кроме того, это незаконно, потому что каждое приложение имеет свой собственный домен приложения, и по умолчанию ни одному приложению не разрешен доступ к его границе.
@HasaniH Спасибо за ваш комментарий. Я хочу присвоить полученный указатель объекту С#, и тогда оба объекта из С++ и С# будут подключены к одному и тому же дескриптору файла общей памяти.
@MohammadMirmostafa Спасибо за ваш комментарий, это было полезно. Есть ли у вас какие-либо источники об этом?
На самом деле это основа .NET. Вы можете найти его в MSDN. Например, эта ссылка может оказаться полезным.
Вы не получаете указатели, а затем присваиваете их объектам; вы получаете объекты, а затем получаете от них указатели. Если вы хотите, чтобы данные в местоположении A соответствовали местоположению B, вам придется скопировать данные. Таким образом, вы можете закрепить указатель и получить доступ к данным через управляемый язык или объявить Span или Memory для переноса этих данных, но вы не можете хранить управляемый объект в неуправляемой памяти — по самому определению «управляемого объекта». . Обратите внимание, что .NET предоставляет доступ к общей памяти с помощью MemoryMappedFile и UnmanagedMemoryAccessor.





Только для того, чтобы пометить этот вопрос как ответил, чтобы он был полезен, я снова вставил свой комментарий сюда.
It won't be easy to do so. Because in .Net, GC must track the address of all of the variables to de-allocate the pointer, after releasing the last anchor of the variable. Also, it's illegal because each application has it's own Application Domain and by default, no application is allowed to access to out of its boundary.
Пожалуйста, пометьте вопрос как отвеченный. Большое спасибо.
Предположим, что p — это указатель на разделяемую память, вы можете использовать ключевое слово ref для создания ссылки.
byte* p;
ref Foo foo = ref *(Foo*)p;
//foo.a, foo.b
Совершенно непонятно, что вы пытаетесь сделать. Если вы хотите присвоить
foofoo2, просто напишитеfoo2 = foo, это скопирует всю структуру. Структуры являются типами значений (по определению), поэтому невозможно «изменить их адрес», но это и не нужно из-за их семантики значений. Кроме того, вы можете искать переменнуюref(ref Foo foo2 = ref foo;).