Public \ Shared Assembly без GAC - PullRequest
       17

Public \ Shared Assembly без GAC

2 голосов
/ 28 сентября 2011

У меня есть две сборки, и эта сборка использовалась многими приложениями. Мне не нужно иметь это в GAC.

Есть ли способ поделиться сборкой, общедоступной для многих приложений, без использования GAC

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

1 Ответ

1 голос
/ 28 марта 2012

Существует несколько способов обмена сборками между приложениями. Хотя наиболее рекомендуемый вариант - через GAC, у вас также есть следующие варианты:

Зондирование

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

CodeBase

Вы можете указать Uri, в котором находятся общие сборки. В вашем случае эти сборки должны иметь строгое имя, чтобы они могли находиться в общем общем каталоге. Также учтите, что тег CodeBase можно использовать только в файлах конфигурации компьютера или политики издателя.

<?xml version="1.0" encoding="utf?8" ?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas?microsoft?com:asm.v1">
            <dependentAssembly>
                <codeBase version="1.0.0.0" 
                  href= "file:///c:\Shared Assemblies\MySharedAssembly.dll"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

AssemblyResolver

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

class Example
{
    public static void Main()
    {            
        AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;

        // Uses MySharedAssembly
        Foo();
        ...
    }

    private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
    {
        // I guess requested assemblyName is located in this file.
        var file = @"c:\Shared Assemblies\MySharedAssembly.dll";

        try
        {
            return Assembly.LoadFile(file);
        }
        catch (Exception)
        {
           ...
        }
        return null;        
    }
}
...