Проблемы с привязкой сборки в .NET - PullRequest
3 голосов
/ 10 декабря 2008

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 10 декабря 2008

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

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 голосов
/ 29 сентября 2009

Re: Snooganz

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

Assembly theAssembly = Assembly.LoadFile(assemblyFullName);

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

0 голосов
/ 10 декабря 2008

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

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

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

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

0 голосов
/ 10 декабря 2008

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

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

0 голосов
/ 10 декабря 2008

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

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

BeowulfOF

...