Отражение C#: действительно ли возможно найти экземпляр объекта во времени выполнения?

(Если список, о котором Вы говорите, похож на C# List<T>.) Добавляющий некоторые значения к правильным положениям в отсортированный список со многими значениями собирается потребовать меньшего количества операций. Но если количество добавляемых значений станет большим, оно потребует больше.

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

6
задан 16 September 2009 в 15:28
поделиться

6 ответов

Нет, в основном.

У вас может быть какая-то ужасная глобальная карта от типа к «экземпляру интересующего меня типа», но в остальном нет.

В основном , приложение WinForms должно каким-то образом передать ссылку на форму в DLL.

8
ответ дан 10 December 2019 в 02:50
поделиться

Нет, это невозможно, потому что ссылки реализованы в частном порядке Microsoft, они не являются указателями по сравнению с C / C ++, в старом C / C ++ вы могли сканировать свою память, но в .NET нет такие инструменты.

1
ответ дан 10 December 2019 в 02:50
поделиться

Я не понял вашего вопроса. Когда вы ссылаетесь на объект, имеете ли вы в виду, что ищете экземпляр объекта, или вы имеете в виду поиск типа объекта?

Если вы ищете экземпляр, тогда ответ - нет. Если вы ищете тип по имени во время выполнения, то ответ - да.

Следующая строка позволит вам получить все загруженные сборки в AppDomain: AppDomain.CurrentDomain.GetAssemblies ();

Метод экземпляра Assembly.GetTypes () предоставит вам все типы в сборке.

Изменить: забыл, что вы знали имя типа. Вы также можете использовать Assembly.GetType (имя строки) .

0
ответ дан 10 December 2019 в 02:50
поделиться

Вы можете разработать структуру плагинов для своего приложения. Вот пример:

public interface IPlugin
{
void Load(Form mainForm); //Or you can have an interface for you main form that allows your plugin to work with your form.
}

тогда вы можете найти свои плагины при загрузке сборки во время выполнения.

foreach(var type in assembly.GetTypes())
{
if(typeof(IPlugin).IsAssignableFrom(type))
var plugin=(IPlugin)Activator.CreateInstance(type);
plugin.Load(_mainForm);
}

Updatd: Кстати, насколько мне известно, ответ на ваш вопрос - нет

0
ответ дан 10 December 2019 в 02:50
поделиться

Поскольку другие уже ответили, нет, это невозможно в общем случае.

Но для более конкретного сценария вы можете получить список всех Windows из Win API, а затем исследовать каждую на предмет свойств, которые вы пытаетесь найти.

public static class Helper
{
    public static IntPtr[] GetToplevelWindows()
    {
        List<IntPtr> windowList = new List<IntPtr>();
        GCHandle handle = GCHandle.Alloc(windowList);
        try
        {
            Helper.EnumWindows(Helper.EnumWindowsCallback, (IntPtr)handle);
        }
        finally
        {
            handle.Free();
        }

        return windowList.ToArray();
    }

    private delegate bool EnumWindowsCallBackDelegate(IntPtr hwnd, IntPtr lParam);

    [DllImport("user32.Dll")]
    private static extern int EnumWindows(EnumWindowsCallBackDelegate callback, IntPtr lParam);

    private static bool EnumWindowsCallback(IntPtr hwnd, IntPtr lParam)
    {
        ((List<IntPtr>)((GCHandle)lParam).Target).Add(hwnd);
        return true;
    }
}
0
ответ дан 10 December 2019 в 02:50
поделиться

Если вы просто экспериментируете и пытаетесь найти основную форму из своей DLL, вы можете сделать:

//get the current process
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();

//get its main windows handle (only works, if the form is already created)
IntPtr hWnd = p.MainWindowHandle;

//locate the form by its native handle
System.Windows.Forms.Form f = System.Windows.Forms.Form.FromHandle(hWnd) as System.Windows.Forms.Form;

Только что протестировали это для зависимых сборок, а не для динамически загружаемых. Но, возможно, стоит попробовать.

Что касается общей проблемы обнаружения конкретного экземпляра, на этот вопрос уже дан ответ.

0
ответ дан 10 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

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