Ответ 1
Я бы рекомендовал, чтобы приложения ваших клиентов копировали DLL, которые они используют в своем собственном каталоге.
VB6 используется для обмена dll между приложениями, у нас есть термин для этого: DLL Hell
У меня есть приложение С#, которое использует dll. Когда я пытаюсь запустить приложение, он не может найти dll, если он не находится в том же каталоге или в GAC. Я не хочу иметь его в том же каталоге, и я не хочу его устанавливать в GAC. Есть ли способ сообщить программе, где искать библиотеку? (Например, если я хочу распространять приложение для клиентов, и они хотят использовать свои собственные приложения, которые будут использовать DLL.)
Добавлено:
Я хотел бы иметь эту структуру:
MainFolder: библиотеки, приложения
Библиотеки: lib.dll
Приложения: app1.exe
Я не хочу копировать его в GAC или иметь lib.dll в папке Applications. Возможно ли это?
Я бы рекомендовал, чтобы приложения ваших клиентов копировали DLL, которые они используют в своем собственном каталоге.
VB6 используется для обмена dll между приложениями, у нас есть термин для этого: DLL Hell
В главной:
AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{
var filename = new AssemblyName(e.Name).Name;
var path = string.format(@"C:\path\to\assembly\{0}.dll", filename);
return Assembly.LoadFrom(path);
};
Добавьте к этому обработку исключений
DLL должна либо находиться в GAC, либо в каталоге приложения или в подкаталоге, как сказали ответы на ваш предыдущий вопрос.
Если ваши клиенты хотят писать свои собственные приложения с помощью DLL, вы должны либо установить его в GAC, либо заставить их также копировать DLL. Наличие нескольких копий библиотеки звучит не очень хорошо, но это действительно так: это означает, что вы можете обновить одну копию до другой версии, не нарушая все остальное.
Это возможно без GAC, но сборки должны быть сильными, и вы должны вносить изменения в app.config всякий раз, когда изменяется версия или публикация. Это то, что у меня есть Главная программа в \, общие библиотеки в \Shared. и подпрограмму, которую я хочу разделить в \SDK, она использует.. \Shared для сборок.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="shared" />
<dependentAssembly>
<assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" />
<codeBase version="1.0.0.282" href="../protobuf-net.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" />
<codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" />
<codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" />
<codeBase version="11.5.5.0" href="../System.Windows.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" />
<codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Как я уже сказал в своем ответе на ваш предыдущий вопрос:
Используйте Инструкции по перенастройке в файле app.config или machine.config.
Вы можете войти в систему, а затем просмотреть действия, предпринятые каркасом для загрузки сборки. Это позволяет легко диагностировать ошибки загрузки сборки.
Инструмент для этого - "FUSLOGVW.exe" (Fusion Log Viewer, Fusion - имя загрузчика) и включен в SDK.