What I have more in mind is that the people can add easy their code for extensions.
That means:
- Have an easy class to add the magic number in the header for an extension
- Have other people add their own implementations,not just the header
- Have an easy way to add the project with their code
First item it is easy – just create a class RecognizeFirstBytes and pass into constructor the first bytes
As an example,see the sln implementation
public class RecognizeSln : RecognizeFirstBytes
{
public RecognizeSln() : base("EFBBBF0D0A4D6963726F736F66742056697375616C2053747564696F20536F6C7574696F6E2046696C65")
{
Extension = new string[1] { "sln" };
}
}
The second item can be implemented with an interface IRecognize
public interface IRecognize: IEquatable<IRecognize>
{
Result InfoNeeded(byte[] b=null);
string[] Extension { get; set; }
}
The third item can be made by making a third project that either references all other projects,either loading others as plugins . Because of the experience,I choose the most interesting one – plugins. I need first https://github.com/natemcmaster/DotNetCorePlugins . Second I need the plugins to be copied – I use a Target
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="xcopy &quot;$(ProjectDir)../plugins/*.dll&quot; &quot;$(ProjectDir)plugins&quot; /E /F /I /Y /R" />
</Target>
And last I need this plugin loader,when packed as nuget at https://www.nuget.org/packages/FileExtension/,to have also the plugins – for this I use the csproj
<ItemGroup>
<Content Include="plugins\**\*.dll">
<PackagePath>build\net5.0\plugins\</PackagePath>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Leave a Reply