Есть ли способ получить тип только из строк пространства имен / типа? - PullRequest
0 голосов
/ 11 октября 2010

Мне нужно сослаться на тип во внешней сборке.Я знаю пространство имен и имя типа, и я знаю, что сборка будет в GAC, но это все.Есть ли способ получить этот тип.Я вижу, что есть способ получить его по GUID или идентификатору программы, который мне подходит, но я знаю, что люди, разрабатывающие внешнюю сборку, могут отойти от этих COM-подобных атрибутов.Поэтому я не хочу зависеть от них.

Просто для примера, я бы хотел, чтобы мое программное обеспечение было очень универсальным, когда речь заходит об обновлении этого внешнего программного обеспечения.Поэтому я не могу зависеть от того, какие версии сборок для меня существуют.

Ответы [ 3 ]

0 голосов
/ 11 октября 2010

Поскольку вы знаете, что это гарантированно будет в GAC, вы можете перечислить результаты gacutil /l. Это даст вам список каждой сборки в GAC.

С этого момента вы можете запустить цикл, который выполняет следующее:

foreach assemblyName in list
    Create new AppDomain
    Load assembly into new appdomain
    check for type in assembly
    if exists:
        return assemblyName to main appDomain
    Unload appdomain

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

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


Edit:

Как указывает Ганс, для использования Gacutil требуется установка .NET SDK. Если это недопустимый параметр, вы можете использовать C ++ / CLI, чтобы сделать доступным API .NET для извлечения информации из GAC. Существует собственный API для доступа к информации GAC , но это не управляемый API.

0 голосов
/ 11 октября 2010

Вы знаете имя сборки или не знаете?
если вы знаете имя ассемблера, чем это просто:

Object Creator(string assemblyname, string classname) 
{
   System.Type objType = System.Type.GetType(assemblyname + "." + classname);
   Return Activator.CreateInstance(objType);
}
0 голосов
/ 11 октября 2010

Вы можете загрузить сборку по имени, если она находится в GAC, а затем выполнить итерацию по всем ее типам, используя Assembly.GetTypes ().Вы можете использовать loadpartialname, но его нельзя использовать, чтобы получить сборку без полного имени.

Посмотрите на Assembly.Load ()
и Assembly.GetType ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...