Похоже, вы действительно просто хотите получить указатель на соответствующий mach_header_64
(или mach_header
в 32-битных системах).
Если у вас есть указатель, вы можете использовать функцию dladdr
, чтобы узнать, с какой (если есть) машины, с которой он был загружен. Эта функция заполняет структуру Dl_info
, которая включает, помимо прочего, указатель на mach_header_64
для mach-o.
// For TARGET_RT_64_BIT:
#import <TargetConditionals.h>
// For dladdr:
#import <dlfcn.h>
// For mach_header and mach_header_64:
#import <mach-o/loader.h>
#ifdef TARGET_RT_64_BIT
struct mach_header_64 *mach_header_for_address(const void *address) {
Dl_info info;
if (dladdr(address, &info) == 0) {
// address doesn't point into a mach-o.
return 0;
}
struct mach_header_64 *header = (struct mach_header_64 *)info.dli_fbase;
if (header->magic != MH_MAGIC_64) {
// Something went wrong...
return 0;
}
return header;
}
#else
struct mach_header mach_header_for_address(const void *address) {
Dl_info info;
if (dladdr(address, &info) == 0) {
// address doesn't point into a mach-o.
return 0;
}
struct mach_header *header = (struct mach_header *)info.dli_fbase;
if (header->magic != MH_MAGIC) {
// Something went wrong...
return 0;
}
return header;
}
#endif
Моя первая мысль должна была бы добраться ConstructorInfo
использование ConstructorInfo constructorInfo = Type.GetConstructor()
, и затем constructorInfo.Invoke()
это. Я подозреваю это Activator.CreateInstance
мешает вызывать конструкторов, к которым у Вас обычно не было бы доступа, хотя я не помню пробовать его сам.
Я заставил это прокладывать себе путь:
using System;
using System.Reflection;
class Test
{
public String X { get; set; }
Test(String x)
{
this.X = x;
}
}
class Program
{
static void Main()
{
Type type = typeof(Test);
ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
null, new Type[] { typeof(String) }, null);
Object o = c.Invoke(new Object[] { "foo" });
}
}
Прием должен был следовать за конструктором конкретно с GetConstructor
скорее затем пытаясь найти его в результатах GetConstructors
. Пойди разберись.
Возможно, я немного запоздал с ответом, но я столкнулся с аналогичной проблемой, которая соответствует этой теме. Я хотел создать экземпляр закрытого конструктора, используя Activator.CreateInstance и передав ему аргументы.
public class Node
{
string name;
Node parent;
protected Node(string name,Node parent)
{
this.name = name;
this.parent = parent;
}
public static Node Create(string name,Node parent)
{
Node result = Activator.CreateInstance(typeof(Node),BindingFlags.Instance | BindingFlags.NonPublic,null, new object[] { name, parent }, null) as Node;
return result;
}
Сложной частью были флаги привязки. Моим первым побуждением было использовать BindingFlags.CreateInstance | BindingFlags.NonPublic, однако это привело к возникновению исключения: Конструктор MissingMethodException для типа «Узел» не найден. Наслаждайтесь