2008-12-10 6 views
3

Я пишу библиотеку .NET, которая по разным причинам не может быть зарегистрирована в GAC. Эта DLL (назовем это SDK.dll) зависит от других DLL для загрузки.Проблемы с привязкой к сборке в .NET

При написании программы, использующей этот файл SDK.dll, я заметил, что моя программа не удалось загрузить DLL с выделением FileNotFoundException. Это происходит потому, что, хотя мне удалось найти ссылочный файл SDK.dll, CLR не смог загрузить свои зависимости.

Единственный способ решить эту проблему - «Скопировать локальную» SDK.dll и все ее зависимости (что-то, что я не могу сделать из-за проблем с развертыванием) или компиляция моей программы в тот же каталог, что и SDK .dll

Есть ли способ рассказать SDK.dll, где искать его зависимости независимо от его местоположения? Может быть, файл SDK.dll.config может помочь?

ответ

8

Вы можете справиться с этим во время выполнения, подписавшись на это событие:

AppDomain.CurrentDomain.AssemblyResolve 

Это срабатывает, когда среда выполнения не может разрешить сборку. В методе обработчика событий напишите свою логику, чтобы найти сборку и загрузить ее с помощью Assembly.LoadFrom(). Это будет выглядеть примерно так:

public SDKClass() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(FindAssembly); 
} 

private Assembly FindAssembly(object sender, ResolveEventArgs args) 
{ 
    string assemblyPath = "c:\PathToAssembly"; 
    string assemblyName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"; 
    string assemblyFullName = Path.Combine(assemblyPath, assemblyName); 

    Assembly theAssembly = Assembly.Load(assemblyFullName); 

    return theAssembly; 
} 
+0

Than ks, я пытался сделать что-то подобное. – Epu 2011-08-26 20:34:40

0

, чтобы зарегистрировать свою сборку в GAC, она должна быть подписана с помощью strong name.

Если это зависит от других сборок, они должны быть в GAC.

BeowulfOF

+0

Проблема в том, что мне не разрешено регистрировать DLL в GAC ... – Sakin 2008-12-10 15:47:59

0

Вы не можете GAC в SDK, но не могли бы вы GAC в зависимостями?

Читайте также статью MSDN по сборке связывания:

http://msdn.microsoft.com/en-us/library/efs781xb(VS.71).aspx

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

0

Re: Snooganz

Вы, наверное, имели в виду использовать Load File вместо весоизмерительных, например, так:

Assembly theAssembly = Assembly.LoadFile(assemblyFullName); 

Assembly.Load, вероятно, получите вас в бесконечный цикл =)

+0

Пока существует узел, на который указывает «assemblyFullName», нет бесконечного цикла. Событие AssemblyResolve запускается только в том случае, если сборка не найдена, поэтому в этом вызове Assembly.Load (assemblyFullName) он не будет запущен. Образец кода просто продемонстрировал, как обрабатывать событие ... Конечно, вы должны, в случае необходимости, вставить проверку ошибок (например, проверить существование сборок). – Snooganz 2010-01-20 05:12:07

Смежные вопросы