(Если список, о котором Вы говорите, похож на C# List<T>
.) Добавляющий некоторые значения к правильным положениям в отсортированный список со многими значениями собирается потребовать меньшего количества операций. Но если количество добавляемых значений станет большим, оно потребует больше.
я предложил бы использовать не список, но некоторую более подходящую структуру данных в Вашем случае. Как двоичное дерево, например. Отсортированная структура данных с минимальным временем вставки.
Нет, в основном.
У вас может быть какая-то ужасная глобальная карта от типа к «экземпляру интересующего меня типа», но в остальном нет.
В основном , приложение WinForms должно каким-то образом передать ссылку на форму в DLL.
Нет, это невозможно, потому что ссылки реализованы в частном порядке Microsoft, они не являются указателями по сравнению с C / C ++, в старом C / C ++ вы могли сканировать свою память, но в .NET нет такие инструменты.
Я не понял вашего вопроса. Когда вы ссылаетесь на объект, имеете ли вы в виду, что ищете экземпляр объекта, или вы имеете в виду поиск типа объекта?
Если вы ищете экземпляр, тогда ответ - нет. Если вы ищете тип по имени во время выполнения, то ответ - да.
Следующая строка позволит вам получить все загруженные сборки в AppDomain: AppDomain.CurrentDomain.GetAssemblies ();
Метод экземпляра Assembly.GetTypes ()
предоставит вам все типы в сборке.
Изменить: забыл, что вы знали имя типа. Вы также можете использовать Assembly.GetType (имя строки)
.
Вы можете разработать структуру плагинов для своего приложения. Вот пример:
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: Кстати, насколько мне известно, ответ на ваш вопрос - нет
Поскольку другие уже ответили, нет, это невозможно в общем случае.
Но для более конкретного сценария вы можете получить список всех 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;
}
}
Если вы просто экспериментируете и пытаетесь найти основную форму из своей 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;
Только что протестировали это для зависимых сборок, а не для динамически загружаемых. Но, возможно, стоит попробовать.
Что касается общей проблемы обнаружения конкретного экземпляра, на этот вопрос уже дан ответ.