Активатор. CreateInstance с частным запечатанным классом

Похоже, вы действительно просто хотите получить указатель на соответствующий 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
12
задан 13 January 2009 в 17:47
поделиться

3 ответа

Моя первая мысль должна была бы добраться ConstructorInfo использование ConstructorInfo constructorInfo = Type.GetConstructor(), и затем constructorInfo.Invoke() это. Я подозреваю это Activator.CreateInstance мешает вызывать конструкторов, к которым у Вас обычно не было бы доступа, хотя я не помню пробовать его сам.

20
ответ дан 2 December 2019 в 03:14
поделиться

Я заставил это прокладывать себе путь:

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. Пойди разберись.

18
ответ дан 2 December 2019 в 03:14
поделиться

Возможно, я немного запоздал с ответом, но я столкнулся с аналогичной проблемой, которая соответствует этой теме. Я хотел создать экземпляр закрытого конструктора, используя 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 для типа «Узел» не найден. Наслаждайтесь

10
ответ дан 2 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: