jbevain / cecil

Cecil is a library to inspect, modify and create .NET programs and libraries.
MIT License
2.73k stars 624 forks source link

Mono.ArgumentNullOrEmptyException When trying to write embedded symbols assembly to stream #920

Open Tacodiva opened 1 year ago

Tacodiva commented 1 year ago

I want to write an AssemblyDefinition with symbols embedded to a stream. I am doing:

definition.Write(byteStream, new() {
    WriteSymbols = true
});

But this throws an exception:

Mono.ArgumentNullOrEmptyException: Argument null or empty (Parameter 'fileName')
   at Mono.Cecil.Mixin.CheckFileName(String fileName)
   at Mono.Cecil.Cil.EmbeddedPortablePdbWriterProvider.GetSymbolWriter(ModuleDefinition module, String fileName)
   at Mono.Cecil.Cil.DefaultSymbolWriterProvider.GetSymbolWriter(ModuleDefinition module, String fileName)
   at Mono.Cecil.ModuleWriter.GetSymbolWriter(ModuleDefinition module, String fq_name, ISymbolWriterProvider symbol_writer_provider, WriterParameters parameters)
   at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
   at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
   at Mono.Cecil.ModuleDefinition.Write(Stream stream, WriterParameters parameters)
   at Mono.Cecil.AssemblyDefinition.Write(Stream stream, WriterParameters parameters)
   ...

I have not tested this, but I believe the call to CheckFileName in EmbeddedPortablePdbWriterProvider.GetSymbolWriter is not necessary, as I don't think the file name is used by EmbeddedPortablePdbWriter.

https://github.com/jbevain/cecil/blob/56d4409b8a0165830565c6e3f96f41bead2c418b/Mono.Cecil.Cil/PortablePdb.cs#L485-L493

Because of this check, it seems to be impossible to write embedded symbols without writing into a file.