Как получить базовый адрес памяти сборки С#, загруженной в другой домен приложенияC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как получить базовый адрес памяти сборки С#, загруженной в другой домен приложения

Сообщение Anonymous »

Вы можете получить базовый адрес памяти модулей, загруженных в ваш процесс, с помощью кода, подобного приведенному ниже:

Код: Выделить всё

ProcessModuleCollection pc = Process.GetCurrentProcess().Modules;
foreach(ProcessModule pm in pc)
{
Console.WriteLine("The moduleName is " + pm.ModuleName);
Console.WriteLine("The " + pm.ModuleName + "'s base address is: " + pm.BaseAddress);
}

К сожалению, это не работает с моим сценарием. Я создаю новый отдельный AppDomain (называемый Temporal) и использую его для загрузки сборки с диска. Затем я просто выполняю некоторую функцию, содержащуюся в загруженной сборке. Это будет код класса, содержащего всю эту логику:

Код: Выделить всё

public class Loader : MarshalByRefObject
{
object CallInternal(string dll, string method, string[] parameters)
{
byte[] buffer = File.ReadAllBytes(dll);
Assembly a = Assembly.Load(buffer);
Type[] types = a.GetTypes();
MethodInfo m = null;
Type myType = null;
foreach (var type in types)
{

m = type.GetMethod(method);
if (m != null)
{
myType = type;
break;
}
}

if (m != null && myType != null)
{
var myInstance = Activator.CreateInstance(myType);
return m.Invoke(myInstance, new object[] { parameters });
}
else
{
return null;
}
}
public static object Call(string dll, string method, params string[] parameters)
{
AppDomain dom = AppDomain.CreateDomain("Temporal");
Loader ld = (Loader)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName);
object result = ld.CallInternal(dll, typename, method, parameters);
return result;
}

Вопрос в том, есть ли способ получить базовый адрес памяти загруженной сборки без выполнения какого-либо сканирования памяти? Коллекция ProcessModuleCollection, полученная из Process.GetCurrentProcess().Modules, не показывает сборку, загруженную во временную область AppDomain. Разрешен небезопасный и неуправляемый код.

Подробнее здесь: https://stackoverflow.com/questions/665 ... rent-appdo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»