Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 00547db

Browse files
authored
Add references parameter for sgen. (#27425)
* Add references parameter for sgen. * Update code based on code review comments. * Some changes based on Matt's feedback. * Update sgen usage and --parameters (#27332) * update usage and --parameters * update -- parameter in package * Update short format * Format code blocks * Add comments and spaces * add short form argument match method * resovle merge conflict * update help message and other fixes according to pr comments * remove a period in usage message * Take the latest error message change. * Remove unnecessary space. * Make ParseReference method only call one time.
1 parent ede873d commit 00547db

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

src/Microsoft.XmlSerializer.Generator/pkg/build/Microsoft.XmlSerializer.Generator.targets

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<Delete Condition="Exists('$(_SerializerPdbIntermediateFolder)') == 'true'" Files="$(_SerializerPdbIntermediateFolder)" ContinueOnError="true"/>
1313
<Delete Condition="Exists('$(_SerializerCsIntermediateFolder)') == 'true'" Files="$(_SerializerCsIntermediateFolder)" ContinueOnError="true"/>
1414
<Message Text="Running Serialization Tool" Importance="normal" />
15-
<Exec Command="dotnet Microsoft.XmlSerializer.Generator $(IntermediateOutputPath)$(AssemblyName)$(TargetExt) --force --quiet" ContinueOnError="true"/>
15+
<Exec Command="dotnet Microsoft.XmlSerializer.Generator $(IntermediateOutputPath)$(AssemblyName)$(TargetExt) --force --quiet --reference:@(Reference)" ContinueOnError="true"/>
1616
<Warning Condition="Exists('$(_SerializerCsIntermediateFolder)') != 'true'" Text="$(_SGenWarningText)" />
1717
<Csc Condition="Exists('$(_SerializerCsIntermediateFolder)') == 'true'" ContinueOnError="true" OutputAssembly="$(_SerializerDllIntermediateFolder)" References="@(ReferencePath);@(IntermediateAssembly)" EmitDebugInformation="$(DebugSymbols)" Sources="$(_SerializerCsIntermediateFolder)" TargetType="Library" ToolExe="$(CscToolExe)" ToolPath="$(CscToolPath)" DisabledWarnings="$(_SerializationAssemblyDisabledWarnings)"/>
1818
<Warning Condition="Exists('$(_SerializerDllIntermediateFolder)') != 'true' And Exists('$(_SerializerCsIntermediateFolder)') == 'true'" Text="$(_SGenWarningText)"/>
@@ -43,7 +43,7 @@
4343
<Delete Files="%(_ReferenceSerializerIntermediateFolder.Identity).cs" ContinueOnError="true"/>
4444
<Delete Files="%(_ReferenceSerializerIntermediateFolder.Identity).pdb" ContinueOnError="true"/>
4545
<Message Text="Running Serialization Tool for Reference Assembly" Importance="normal" />
46-
<Exec Command="dotnet Microsoft.XmlSerializer.Generator --force --quiet --assembly:%(_TargetSerializationAssembly.Identity) --type:%(_TargetSerializationAssembly.SerializationTypes) --out:$(IntermediateOutputPath)" ContinueOnError="true" />
46+
<Exec Command="dotnet Microsoft.XmlSerializer.Generator --force --quiet --reference:@(Reference) --assembly:%(_TargetSerializationAssembly.Identity) --type:%(_TargetSerializationAssembly.SerializationTypes) --out:$(IntermediateOutputPath)" ContinueOnError="true" />
4747
<Warning Condition="Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs') != 'true'" Text="SGEN: Fail to generate %(_ReferenceSerializationAssemblyName.Identity)'. Please follow the instructions at https://go.microsoft.com/fwlink/?linkid=858594 and try again." />
4848
<Csc Condition="Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs') == 'true'" ContinueOnError="true" OutputAssembly="$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).dll" References="@(ReferencePath);@(IntermediateAssembly)" EmitDebugInformation="$(DebugSymbols)" Sources="$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs" TargetType="Library" ToolExe="$(CscToolExe)" ToolPath="$(CscToolPath)" DisabledWarnings="$(_SerializationAssemblyDisabledWarnings)"/>
4949
<Warning Condition="Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).dll') != 'true' And Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs') == 'true'" Text="SGEN: Fail to compile %(_ReferenceSerializationAssemblyName.Identity).cs. Please follow the instructions at https://go.microsoft.com/fwlink/?linkid=858594 and try again." />

src/Microsoft.XmlSerializer.Generator/src/Sgen.cs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public static int Main(string[] args)
2121
return sgen.Run(args);
2222
}
2323

24+
private static string s_references = string.Empty;
25+
private static Dictionary<string, string> s_referencedic = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
26+
2427
private int Run(string[] args)
2528
{
2629
string assembly = null;
@@ -35,6 +38,8 @@ private int Run(string[] args)
3538
bool silent = false;
3639
bool warnings = false;
3740

41+
AppDomain.CurrentDomain.AssemblyResolve += SgenAssemblyResolver;
42+
3843
try
3944
{
4045
for (int i = 0; i < args.Length; i++)
@@ -115,6 +120,14 @@ private int Run(string[] args)
115120
{
116121
warnings = true;
117122
}
123+
else if (ArgumentMatch(arg, "reference"))
124+
{
125+
s_references = value;
126+
if (!string.IsNullOrEmpty(s_references))
127+
{
128+
ParseReferences();
129+
}
130+
}
118131
else
119132
{
120133
if (arg.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || arg.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
@@ -489,5 +502,76 @@ private static string GetTempAssemblyName(AssemblyName parent, string ns)
489502
{
490503
return parent.Name + ".XmlSerializers" + (ns == null || ns.Length == 0 ? "" : "." + ns.GetHashCode());
491504
}
505+
506+
private static void ParseReferences()
507+
{
508+
var referencelist = new List<string>();
509+
if (s_references.Length > 0)
510+
{
511+
foreach(var entry in s_references.Split(';'))
512+
{
513+
string trimentry = entry.Trim();
514+
if (string.IsNullOrEmpty(trimentry))
515+
continue;
516+
referencelist.Add(trimentry);
517+
}
518+
}
519+
520+
foreach (var reference in referencelist)
521+
{
522+
if (reference.EndsWith(".dll") || reference.EndsWith(".exe"))
523+
{
524+
if (File.Exists(reference))
525+
{
526+
string filename = Path.GetFileNameWithoutExtension(reference);
527+
if (!string.IsNullOrEmpty(filename))
528+
{
529+
s_referencedic.Add(filename, reference);
530+
}
531+
}
532+
}
533+
534+
}
535+
}
536+
537+
private static Assembly SgenAssemblyResolver(object source, ResolveEventArgs e)
538+
{
539+
try
540+
{
541+
if (string.IsNullOrEmpty(e.Name) || e.Name.Split(',').Length == 0)
542+
{
543+
return null;
544+
}
545+
546+
string assemblyname = e.Name.Split(',')[0];
547+
if (string.IsNullOrEmpty(assemblyname))
548+
{
549+
return null;
550+
}
551+
552+
if(s_referencedic.ContainsKey(assemblyname))
553+
{
554+
string reference = s_referencedic[assemblyname];
555+
if (!string.IsNullOrEmpty(reference))
556+
{
557+
if (File.Exists(reference))
558+
{
559+
return Assembly.LoadFrom(reference);
560+
}
561+
}
562+
}
563+
}
564+
catch (Exception exp)
565+
{
566+
if (exp is ThreadAbortException || exp is StackOverflowException || exp is OutOfMemoryException)
567+
{
568+
throw;
569+
}
570+
571+
WriteWarning(exp, true);
572+
}
573+
574+
return null;
575+
}
492576
}
493577
}

0 commit comments

Comments
 (0)