README languages:
Table of Contents
ソースコードをファイルに展開するライブラリです。
ソースジェネレーターで埋め込まれたソースコードを展開するコンソールアプリです。
ソースジェネレーターで埋め込まれたソースコードを展開するライブラリです。
ソースコードを埋め込むライブラリです。
Library | NuGet |
---|---|
SourceExpander | |
SourceExpander.Core | |
SourceExpander.Embedder | |
SourceExpander.Generator | |
SourceExpander.Console |
このライブラリはソースジェネレーターを使用するため、 .NET 5 SDK または Visual Studio 16.8 以降が必須です。
Install:
dotnet tool install -g SourceExpander.Console
Run:
# minimum run
dotnet-source-expand Sample/SampleProject2/Program.cs
# specified project
dotnet-source-expand Sample/SampleProject/Put.cs -p Sample/SampleProject2/SampleProject2.csproj
Sample や https://github.com/kzrnm/ac-library-csharp を参考としてください。
Install-Package SourceExpander
Install-Package <ソースコードが埋め込まれたライブラリ>
using System;
class Program
{
static void Main()
{
SourceExpander.Expander.Expand();
// Your code
}
}
このコードを実行すると, SourceExpander.Expander.Expand()
でソースコードが結合された下記のようなファイルが出力されます。
using System;
class Program
{
static void Main()
{
SourceExpander.Expander.Expand();
// Your code
}
}
#region Expanded by https://github.com/kzrnm/SourceExpander
namespace SourceExpander { public class Expander { [Conditional("EXPANDER")] public static void Expand(string inputFilePath = null, string outputFilePath = null, bool ignoreAnyError = true) { } public static string ExpandString(string inputFilePath = null, bool ignoreAnyError = true) { return ""; } } }
// library code
#endregion Expanded by https://github.com/kzrnm/SourceExpander
SourceExpander.Embedder
をインストールするだけでOKです。
Install-Package SourceExpander.Embedder
SourceExpander.NotEmbeddingSourceAttribute
を適用した型については埋め込みをスキップします。
SourceExpander.Embedder
はコンパイル時に実行されるので、埋め込んだソースコードを同一のプロジェクトで利用することはできません。
SourceExpander.Embedder
は下記のようなコードを埋め込みます。
using System.Reflection;
[assembly: AssemblyMetadata("SourceExpander.EmbedderVersion", "2.5.0.101")]
[assembly: AssemblyMetadata("SourceExpander.EmbeddedLanguageVersion", "2")]
[assembly: AssemblyMetadata("SourceExpander.EmbeddedAllowUnsafe", "true")]
[assembly: AssemblyMetadata("SourceExpander.EmbeddedSourceCode.GZipBase32768", "㘅桠ҠҠԀᏕ䴾阺㹈斪筟楸厮嫉盆炚磈臤梽胍㦬竂帙詪煩㔬樄ᗗ踜鲯诇ᠩ珱䪜䐽闾鱏珣茙灸䏙⨧㤄寨砳⬅ស䮙松Ꝉ㥅䱀餯ꃣ虱嫁榏㪰糰蝃技夛䥘谼礞䐿斄禕蚷屔彺㪪賳鱥䝢鰨覶⬴誼⬼獬鞨胒宝䭴摺眚䅗䃝䚏隻嫻痛簴Ꜿ変⇣㇋聼欈Ꭽ墷霶勎嶐窢銖㤁┠䁺⠛缧䋹凬☂䁸栣僼邐䑹瘜蛭諠賿㨚咈鍂ꄱ禱唨毊崨叼緭䥜榄闺䦖麷䘘㨵ᖶ琜鎎ᰇ髎飭㪬採ꅈ㥞盧䢽䃘煃⬘喔渻莖案ᯋ硟ꋛ叝谴缄ꍢ⋗溁ᣒ颂浢ꍈꉭ㑆焤鹠杳煄㾳䴡䂱㙽楯裦鷬梙掫取颤⩑㰑㕋ꂤ碎麓㾕昖啘繅餬簚盎鍣䨽籭詽绑襌硲❞擧ꌥ膩辪聫㭒珥㴟囓䓖焜铽痢ꊆꍼᓥ囦纇維Ⲡ㤬垇螇感縋㼎砾褳強襓瀕樥阵瀭蜺兔峃絻藈萢饑㶬櫊綖嶅鏕㻶坶禵䓓Ⴐ咇詤煑⬐毱㱒獅鐥椳䖑ᙋ冄㴼㗭隯顑命貽职葅苫⢸栚䀹䢳噂槝䲰䰮⇷ᔈ⎙䕪絑㝖垿䞉場珟䉛㰭䵶日憭蕼馣㸩涴䓋䃇懚鹯琥镌ⴊ電萞猛流癊⏔恚Ԉң")]
//[assembly: AssemblyMetadata("SourceExpander.EmbeddedSourceCode", "[{\"CodeBody\":\"namespace SampleLibrary { public static class Bit { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int ExtractLowestSetBit(int n) { if (Bmi1.IsSupported) { return (int)Bmi1.ExtractLowestSetBit((uint)n); } return n & -n; } } } \",\"Dependencies\":[],\"FileName\":\"_SampleLibrary>Bit.cs\",\"TypeNames\":[\"SampleLibrary.Bit\"],\"Usings\":[\"using System.Runtime.CompilerServices;\",\"using System.Runtime.Intrinsics.X86;\"]},{\"CodeBody\":\"namespace SampleLibrary { public static class Put { private static readonly Xorshift rnd = new Xorshift(); public static void WriteRandom() { Trace.WriteLine(rnd.Next()); } } } \",\"Dependencies\":[\"_SampleLibrary>Xorshift.cs\"],\"FileName\":\"_SampleLibrary>Put.cs\",\"TypeNames\":[\"SampleLibrary.Put\"],\"Usings\":[\"using System.Diagnostics;\"]},{\"CodeBody\":\"namespace SampleLibrary { public class Xorshift : Random { private uint x = 123456789; private uint y = 362436069; private uint z = 521288629; private uint w; private static readonly Random rnd = new Random(); public Xorshift() : this(rnd.Next()) { } public Xorshift(int seed) { w = (uint)seed; } protected override double Sample() { return InternalSample() * (1.0 \\/ uint.MaxValue); } private uint InternalSample() { uint t = x ^ (x << 11); x = y; y = z; z = w; return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); } } } \",\"Dependencies\":[],\"FileName\":\"_SampleLibrary>Xorshift.cs\",\"TypeNames\":[\"SampleLibrary.Xorshift\"],\"Usings\":[\"using System;\"]}]")]
SourceExpander.Embedder
の AssemblyVersion です。
埋め込まれたソースコードの C# のバージョンです。
true
ならば埋め込まれたソースコードは unsafe
が許可されています。
実際には埋め込まれませんが、説明用に記述します。
SourceFileInfo
を JSON シリアライズしたものです。
public class SourceFileInfo
{
/// <summary>
/// Unique name of file
/// </summary>
public string FileName { get; set; }
/// <summary>
/// Defined types like class, struct, record, enum, delegate
/// </summary>
public IEnumerable<string> TypeNames { get; set; }
/// <summary>
/// Using directives
/// </summary>
public IEnumerable<string> Usings { get; set; }
/// <summary>
/// FileNames that the this depending on
/// </summary>
public IEnumerable<string> Dependencies { get; set; }
/// <summary>
/// Code body that removed using directives
/// </summary>
public string CodeBody { get; set; }
}
EmbeddedSourceCode の JSON を gzip 圧縮し、base32768 でエンコードしたものです。