没有GAC的公共\共享程序集

时间:2011-09-28 02:33:24

标签: visual-studio-2008 gac

我有两个程序集,许多应用程序都使用了这个程序集。我不必在GAC中拥有此功能。

有没有办法在不使用GAC的情况下共享许多应用程序可公开访问的程序集

我的客户不想将这些dll转储到GAC中,因为这些程序集由三个应用程序使用所以我不想在GAC中保留

1 个答案:

答案 0 :(得分:1)

有一些方法可以在应用程序之间共享程序集。虽然最推荐的是通过GAC,但您还有其他选择:

探测

您可以在应用程序基目录下指定一个子目录来搜索程序集。我认为这对您无效,因为这对不同的应用程序无效。

基本代码

您可以指定共享程序集所在的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;        
    }
}