我有一个每天执行一次的 Windows 服务。这只是10分钟的行动。
我在网站的 bin 文件夹中构建服务的文件,因为该服务使用网站的 dll。
不幸的是,我注意到当我安装网站模块(网站安装程序的 dotnetnuke .zip 模块)时,我收到一个错误,即文件被另一个进程锁定。
在安装每个模块之前禁用服务是非常有问题的,所以我想让我的服务不锁定其中使用的 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);
}
}
私有缓存已创建且未锁定,并且原始文件已锁定。<-现在这对我来说很荒谬。