c# – 使用.NET程序集而不锁定dll文件

前端之家收集整理的这篇文章主要介绍了c# – 使用.NET程序集而不锁定dll文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个每天执行一次的 Windows服务.这只是10分钟的行动.

我在网站的bin文件夹中构建服务的文件,因为该服务使用网站dll的.

不幸的是我注意到当我安装网站模块(网站安装程序的dotnetnuke .zip模块)时,我收到一个错误,该文件被antoher进程锁定.

在安装每个模块之前禁用服务是非常有问题的,所以我想让我的服务不能锁定其中使用的dll.

我读到了AppDomain和ShadowCopyFiles选项,但我不能让它们适合我.

这是我如何使用ShadowCopyFiles的示例:

class Program
{
    static string GenerateRandomName()
    {
        //maybe name must be unique?!
        var random = new Random();
        return "a" + random.Next().ToString() + "b" + random.Next();
    }

    static int RandomNumber()
    {
        var info = ConfigureAppDomainSettings();

        var domain = AppDomain.CreateDomain(GenerateRandomName(),null,info);
        var assembly = domain.Load("SharedLibrary");
        var shared = (SharedLibrary.IShared)assembly.CreateInstance("SharedLibrary.Shared");

        int retVal = shared.RandomNumber();

        AppDomain.Unload(domain);

        domain = null;
        assembly = null;
        shared = null;
        info = null;

        Console.WriteLine("before cleanning");
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForFullGCComplete();
        GC.Collect();
        Console.WriteLine("after cleanning");

        return retVal;
    }

    static AppDomainSetup ConfigureAppDomainSettings()
    {
        AppDomainSetup domainSettings = AppDomain.CurrentDomain.SetupInformation;
        domainSettings.ShadowCopyFiles = "true";
        domainSettings.CachePath = @"C:\inetpub\wwwroot\eshop\DesktopModules\Rossnet_EShop\SharedAssemblyTest\PrivateCache";

        return domainSettings;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(RandomNumber());

        Console.ReadKey();
    }
}

示例汇编代码

public interface IShared
{
    int RandomNumber();
}

[Serializable]
public class Shared : IShared
{
    public int RandomNumber()
    {
        var random = new Random();
        return random.Next(20);
    }
}

创建私有缓存但未锁定,并锁定原始文件. < - 现在这对我来说很荒谬.

解决方法

如果您有权修改使用程序集的所有代码,只需通过带有byte []的 Assembly.Load 重载来加载它们就可以了.您将自己阅读该文件,并将其传递给该方法.我自己使用这种方法(但出于其他原因),它使我能够随时更新文件.

轻松实现这一目标(虽然有点奇怪)是重命名你的文件(从.dll到其他东西,所以找不到它们),然后订阅AppDomain.AssemblyResolve 事件,当它们丢失时将被调用,此时您可以使用手动加载程序集的代码.

原文链接:https://www.f2er.com/csharp/243154.html

猜你在找的C#相关文章