Skip to content

Commit 7dcbe4e

Browse files
committed
Randomize assembly file names for better concurrency
There is the potential of file collisions when several `PersistentProxy- Builder`s are used concurrently. Better use a random name fragment in- stead of a steadily increasing generation count.
1 parent 9e3b74f commit 7dcbe4e

2 files changed

Lines changed: 3 additions & 7 deletions

File tree

src/Castle.Core/DynamicProxy/PersistentIsolatedTypesModuleScope.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ internal sealed class PersistentIsolatedTypesModuleScope : ModuleScope
4040
private readonly bool savePhysicalAssemblies;
4141
private readonly string outputDirectory;
4242

43-
private int assemblyCount;
4443
private bool usingStrongNamedModule;
4544

4645
public PersistentIsolatedTypesModuleScope(bool savePhysicalAssemblies = true,
@@ -50,7 +49,6 @@ public PersistentIsolatedTypesModuleScope(bool savePhysicalAssemblies = true,
5049
this.savePhysicalAssemblies = savePhysicalAssemblies;
5150
this.outputDirectory = outputDirectory ?? Directory.GetCurrentDirectory();
5251

53-
assemblyCount = 0;
5452
usingStrongNamedModule = false;
5553
}
5654

@@ -99,8 +97,6 @@ internal override Type BuildType(TypeBuilder typeBuilder)
9997

10098
if (IsAuxiliaryType(typeName) == false)
10199
{
102-
assemblyCount++;
103-
104100
var assemblyBuilder = (PersistedAssemblyBuilder)typeBuilder.Assembly;
105101

106102
using var stream = new MemoryStream();
@@ -110,9 +106,10 @@ internal override Type BuildType(TypeBuilder typeBuilder)
110106
{
111107
var inStrongNamedModule = type.Module == StrongNamedModule;
112108
var assemblyFileName = inStrongNamedModule ? StrongNamedModuleName : WeakNamedModuleName;
109+
var randomNameFragment = Guid.NewGuid().ToString("N");
113110
assemblyFileName = Path.ChangeExtension(
114111
assemblyFileName,
115-
string.Concat(".", assemblyCount.ToString(), Path.GetExtension(assemblyFileName)));
112+
string.Concat(".", randomNameFragment, Path.GetExtension(assemblyFileName)));
116113
var assemblyPath = Path.Combine(outputDirectory, assemblyFileName);
117114

118115
using var file = File.Open(assemblyPath, FileMode.Create, FileAccess.Write);

src/Castle.Core/DynamicProxy/PersistentProxyBuilder.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ public PersistentProxyBuilder() : base(new ModuleScope(true))
6060
/// <remarks>
6161
/// <para>
6262
/// Each assembly will be automatically saved when the proxy type is created.
63-
/// Saved assemblies include a generation number in their file names
64-
/// (e. g. <c>CastleDynProxy2.{1,2,3,...}.dll</c>) so previous assemblies
63+
/// Saved assemblies have partially randomized file names so previous assemblies
6564
/// aren't overwritten.
6665
/// </para>
6766
/// <para>

0 commit comments

Comments
 (0)