Проблемы с привязкой сборки в .NET

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

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

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

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

10.12.2008 14:00:49
5 ОТВЕТОВ
РЕШЕНИЕ

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

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;
}
8
10.12.2008 15:25:58
Спасибо, я пытался сделать что-то подобное.
Epu 26.08.2011 20:34:40

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

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

BeowulfOF

0
10.12.2008 14:05:29

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

Также прочтите эту статью о привязке сборки:

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

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

0
10.12.2008 14:10:10

Попробуйте использовать переменную DEVPATH env.

http://msdn.microsoft.com/en-us/library/cskzh7h6.aspx

0
10.12.2008 14:53:41

Re: Snooganz

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

Assembly theAssembly = Assembly.LoadFile(assemblyFullName);

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

0
19.05.2016 08:50:17
Пока существует сборка, на которую указывает «assemblyFullName», бесконечного цикла нет. Событие AssemblyResolve вызывается только в том случае, если сборка не может быть найдена, поэтому при вызове Assembly.Load она не будет запускаться снова (assemblyFullName). Пример кода был просто для демонстрации того, как обрабатывать событие ... Вы должны, конечно, вставлять проверку ошибок, где это необходимо (например, проверку существования сборок).
Snooganz 20.01.2010 05:12:07