├── DotScreencap ├── PictureFormat.cs ├── IScreenRegion.cs ├── DotScreencap.sln ├── PictureCreator.cs ├── AnimationCreator.cs ├── Properties │ └── AssemblyInfo.cs ├── ScreenRegion.cs ├── DotScreencap.csproj └── ScreenCapture.cs ├── README.md ├── LICENSE └── .gitignore /DotScreencap/PictureFormat.cs: -------------------------------------------------------------------------------- 1 | namespace DotScreencap 2 | { 3 | /// 4 | /// Represents the enumeration. 5 | /// 6 | public enum PictureFormat 7 | { 8 | /// 9 | /// The jpg format. 10 | /// 11 | Jpg, 12 | 13 | /// 14 | /// The bmp format. 15 | /// 16 | Bmp 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dot-screencap 2 | 3 | ## Features 4 | + Take screenshots 5 | 6 | ``` csharp 7 | var screencap = new ScreenCapture(); 8 | screencap.TakeScreenshot(); 9 | ``` 10 | + Record animations 11 | 12 | ``` csharp 13 | var screencap = new ScreenCapture 14 | { 15 | // Recommended for large resolution 16 | // recordings and long GIFs. 17 | ScalingFactor = 2 18 | }; 19 | 20 | // Records a GIF with 100 frames, 21 | // every 50 ms is a frame recorded. 22 | screencap.RecordAnimation(100, 50); 23 | ``` 24 | 25 | + Select screenregion 26 | 27 | ``` csharp 28 | var screencap = new ScreenCapture(); 29 | screencap.ScreenRegion = new ScreenRegion(...); 30 | ``` 31 | 32 | *** 33 | 34 | ## How to use it in your solution 35 | Clone this repository and build the solution. 36 | Add a reference to the built DotScreencap.dll in your solution. 37 | -------------------------------------------------------------------------------- /DotScreencap/IScreenRegion.cs: -------------------------------------------------------------------------------- 1 | using System.Drawing; 2 | 3 | namespace DotScreencap 4 | { 5 | /// 6 | /// Represents the interface. 7 | /// 8 | public interface IScreenRegion 9 | { 10 | /// 11 | /// Gets or sets the upper left corner . 12 | /// 13 | Point UpperLeftCorner { get; set; } 14 | 15 | /// 16 | /// Gets or sets the lower right corner . 17 | /// 18 | Point LowerRightCorner { get; set; } 19 | 20 | /// 21 | /// Gets the height of the selected screenregion. 22 | /// 23 | int Height { get; } 24 | 25 | /// 26 | /// Gets the width of the selected screenregion. 27 | /// 28 | int Width { get; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /DotScreencap/DotScreencap.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26206.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotScreencap", "DotScreencap.csproj", "{674B7EAA-F14A-4FC7-AB7D-3390DCC52285}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {674B7EAA-F14A-4FC7-AB7D-3390DCC52285}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {674B7EAA-F14A-4FC7-AB7D-3390DCC52285}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {674B7EAA-F14A-4FC7-AB7D-3390DCC52285}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {674B7EAA-F14A-4FC7-AB7D-3390DCC52285}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 - 2017 Bernhard Speiser 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /DotScreencap/PictureCreator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Windows.Media.Imaging; 4 | 5 | namespace DotScreencap 6 | { 7 | /// 8 | /// Represents the class. 9 | /// 10 | internal static class PictureCreator 11 | { 12 | internal static void TakeScreenshot(BitmapImage bitmap, PictureFormat format, string filename, int quality) 13 | { 14 | BitmapEncoder encoder; 15 | 16 | switch (format) 17 | { 18 | case PictureFormat.Jpg: 19 | filename += ".jpg"; 20 | encoder = new JpegBitmapEncoder { QualityLevel = quality }; 21 | break; 22 | case PictureFormat.Bmp: 23 | filename += ".bmp"; 24 | encoder = new BmpBitmapEncoder(); 25 | break; 26 | default: 27 | throw new ArgumentException($"Unknown format {nameof(format)}"); 28 | } 29 | 30 | using (var fs = new FileStream(filename, FileMode.OpenOrCreate)) 31 | { 32 | encoder.Frames.Add(BitmapFrame.Create(bitmap)); 33 | encoder.Save(fs); 34 | encoder.Frames.Clear(); 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /DotScreencap/AnimationCreator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Threading; 4 | using System.Windows; 5 | using System.Windows.Interop; 6 | using System.Windows.Media.Imaging; 7 | 8 | namespace DotScreencap 9 | { 10 | internal static class AnimationCreator 11 | { 12 | public static void CreateAnimation(ScreenCapture sc, int frames, int wait, string filename) 13 | { 14 | var encoder = new GifBitmapEncoder(); 15 | 16 | for (var i = 0; i < frames; i++) 17 | { 18 | using (var bmp = sc.GetBitmapOfScreen()) 19 | { 20 | var size = BitmapSizeOptions.FromEmptyOptions(); 21 | var source = Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, size); 22 | var frame = BitmapFrame.Create(source); 23 | encoder.Frames.Add(frame); 24 | } 25 | 26 | GC.Collect(); 27 | GC.WaitForPendingFinalizers(); 28 | Thread.Sleep(wait); 29 | } 30 | 31 | Thread.Sleep(1000); 32 | using (var fs = new FileStream(filename, FileMode.Create)) 33 | { 34 | encoder.Save(fs); 35 | encoder.Frames.Clear(); 36 | encoder = null; 37 | } 38 | 39 | GC.Collect(); 40 | GC.WaitForPendingFinalizers(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /DotScreencap/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("DotScreencap")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("DotScreencap")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("674b7eaa-f14a-4fc7-ab7d-3390dcc52285")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /DotScreencap/ScreenRegion.cs: -------------------------------------------------------------------------------- 1 | using System.Drawing; 2 | 3 | namespace DotScreencap 4 | { 5 | /// 6 | /// Represents the class. 7 | /// 8 | public class ScreenRegion : IScreenRegion 9 | { 10 | /// 11 | /// Initializes a new instance of the class. 12 | /// 13 | /// The upper left corner . 14 | /// The lower right corner . 15 | public ScreenRegion(Point upperleft, Point lowerright) 16 | { 17 | this.UpperLeftCorner = upperleft; 18 | this.LowerRightCorner = lowerright; 19 | } 20 | 21 | /// 22 | /// Gets or sets the upper left corner . 23 | /// 24 | public Point UpperLeftCorner { get; set; } 25 | 26 | /// 27 | /// Gets or sets the lower right corner . 28 | /// 29 | public Point LowerRightCorner { get; set; } 30 | 31 | /// 32 | /// Gets the height of the selected screenregion. 33 | /// 34 | public int Height => this.LowerRightCorner.Y - this.UpperLeftCorner.Y; 35 | 36 | /// 37 | /// Gets the width of the selected screenregion. 38 | /// 39 | public int Width => this.LowerRightCorner.X - this.UpperLeftCorner.X; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /DotScreencap/DotScreencap.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {674B7EAA-F14A-4FC7-AB7D-3390DCC52285} 8 | Library 9 | Properties 10 | DotScreencap 11 | DotScreencap 12 | v4.6.2 13 | 512 14 | 15 | 16 | true 17 | full 18 | false 19 | bin\Debug\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | bin\Debug\DotScreencap.xml 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /DotScreencap/ScreenCapture.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Drawing.Imaging; 4 | using System.IO; 5 | using System.Windows.Forms; 6 | using System.Windows.Media.Imaging; 7 | 8 | namespace DotScreencap 9 | { 10 | /// 11 | /// Represents the class. 12 | /// Visit https://github.com/Speiser/dot-screencap. 13 | /// 14 | public class ScreenCapture 15 | { 16 | private int _scalingFactor = 1; 17 | 18 | /// 19 | /// Initializes a new instance of the class. 20 | /// 21 | public ScreenCapture() 22 | { 23 | var screenSize = Screen.PrimaryScreen.Bounds; 24 | this.ScreenRegion = new ScreenRegion(new Point(0, 0), 25 | new Point(screenSize.Width, screenSize.Height)); 26 | } 27 | 28 | /// 29 | /// Gets an array of all displays on the system. 30 | /// 31 | public Screen[] AllScreens => Screen.AllScreens; 32 | 33 | /// 34 | /// Gets or sets the scaling factor. 35 | /// This value is used to lower the gif pixel size. 36 | /// Size = Height / ScalingFactor: Width / ScalingFactor. 37 | /// Default is 1. Raise the value if you want to record long gifs. 38 | /// 39 | /// 40 | /// Thrown if value is less than 1. 41 | /// 42 | public int ScalingFactor 43 | { 44 | get => _scalingFactor; 45 | set 46 | { 47 | if (value < 1) 48 | throw new ArgumentOutOfRangeException( 49 | nameof(value), 50 | "Value has to greater than or equal to 1." 51 | ); 52 | 53 | _scalingFactor = value; 54 | } 55 | } 56 | 57 | /// 58 | /// Gets or sets the current . 59 | /// 60 | public IScreenRegion ScreenRegion { get; set; } 61 | 62 | /// 63 | /// Takes a screenshot and saves it to the execution folder. 64 | /// 65 | /// [Optional] Picture format. 66 | /// [Optional] File name. 67 | /// [Optional] Quality level of a . 68 | public void TakeScreenshot(PictureFormat format = PictureFormat.Jpg, string filename = "screenshot", int quality = 100) 69 | { 70 | var bitmap = this.GetBitmapOfScreen(); 71 | var bitmapImage = this.GetBitmapImageFromBitmap(bitmap); 72 | 73 | PictureCreator.TakeScreenshot(bitmapImage, format, filename, quality); 74 | 75 | bitmap.Dispose(); 76 | bitmapImage.StreamSource.Close(); 77 | bitmapImage = null; 78 | 79 | GC.Collect(); 80 | GC.WaitForPendingFinalizers(); 81 | } 82 | 83 | /// 84 | /// Records and saves an animation to the execution folder. 85 | /// 86 | /// Amount of frames that will be captured. 87 | /// Time in milliseconds between each frame. 88 | /// [Optional] File name. 89 | public void RecordAnimation(int frames, int wait, string filename = "recording.gif") 90 | { 91 | AnimationCreator.CreateAnimation(this, frames, wait, filename); 92 | } 93 | 94 | internal Bitmap GetBitmapOfScreen() 95 | { 96 | var bitmap = new Bitmap(this.ScreenRegion.Width, this.ScreenRegion.Height); 97 | using (var screen = Graphics.FromImage(bitmap)) 98 | { 99 | screen.CopyFromScreen( 100 | this.ScreenRegion.UpperLeftCorner.X, 101 | this.ScreenRegion.UpperLeftCorner.Y, 0, 0, 102 | new Size(this.ScreenRegion.Width, this.ScreenRegion.Height) 103 | ); 104 | } 105 | 106 | GC.Collect(); 107 | GC.WaitForPendingFinalizers(); 108 | 109 | if (ScalingFactor > 1) 110 | { 111 | bitmap = new Bitmap(bitmap, new Size(this.ScreenRegion.Width / this.ScalingFactor, 112 | this.ScreenRegion.Height / this.ScalingFactor)); 113 | } 114 | 115 | return bitmap; 116 | } 117 | 118 | internal BitmapImage GetBitmapImageFromBitmap(Bitmap bitmap) 119 | { 120 | var bitmapImage = new BitmapImage(); 121 | 122 | // Don´t dispose the memory stream here or 123 | // BitmapFrame.Create(bitmap) in PictureCreator 124 | // will throw an ObjectDisposedException! 125 | // The memory stream is disposed in 126 | // this.TakeScreenshot()... 127 | var ms = new MemoryStream(); 128 | bitmap.Save(ms, ImageFormat.Bmp); 129 | ms.Seek(0, SeekOrigin.Begin); 130 | 131 | bitmapImage.BeginInit(); 132 | bitmapImage.StreamSource = ms; 133 | bitmapImage.EndInit(); 134 | 135 | return bitmapImage; 136 | } 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # my stuff 5 | site/ 6 | *.StyleCop 7 | tests/ 8 | TODO.txt 9 | *.cd 10 | 11 | # Will be added later 12 | Examples/ 13 | 14 | # User-specific files 15 | *.suo 16 | *.user 17 | *.userosscache 18 | *.sln.docstates 19 | 20 | # User-specific files (MonoDevelop/Xamarin Studio) 21 | *.userprefs 22 | 23 | # Build results 24 | [Dd]ebug/ 25 | [Dd]ebugPublic/ 26 | [Rr]elease/ 27 | [Rr]eleases/ 28 | x64/ 29 | x86/ 30 | bld/ 31 | [Bb]in/ 32 | [Oo]bj/ 33 | [Ll]og/ 34 | 35 | # Visual Studio 2015 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # MSTest test Results 41 | [Tt]est[Rr]esult*/ 42 | [Bb]uild[Ll]og.* 43 | 44 | # NUNIT 45 | *.VisualState.xml 46 | TestResult.xml 47 | 48 | # Build Results of an ATL Project 49 | [Dd]ebugPS/ 50 | [Rr]eleasePS/ 51 | dlldata.c 52 | 53 | # DNX 54 | project.lock.json 55 | artifacts/ 56 | 57 | *_i.c 58 | *_p.c 59 | *_i.h 60 | *.ilk 61 | *.meta 62 | *.obj 63 | *.pch 64 | *.pdb 65 | *.pgc 66 | *.pgd 67 | *.rsp 68 | *.sbr 69 | *.tlb 70 | *.tli 71 | *.tlh 72 | *.tmp 73 | *.tmp_proj 74 | *.log 75 | *.vspscc 76 | *.vssscc 77 | .builds 78 | *.pidb 79 | *.svclog 80 | *.scc 81 | 82 | # Chutzpah Test files 83 | _Chutzpah* 84 | 85 | # Visual C++ cache files 86 | ipch/ 87 | *.aps 88 | *.ncb 89 | *.opendb 90 | *.opensdf 91 | *.sdf 92 | *.cachefile 93 | *.VC.db 94 | *.VC.VC.opendb 95 | 96 | # Visual Studio profiler 97 | *.psess 98 | *.vsp 99 | *.vspx 100 | *.sap 101 | 102 | # TFS 2012 Local Workspace 103 | $tf/ 104 | 105 | # Guidance Automation Toolkit 106 | *.gpState 107 | 108 | # ReSharper is a .NET coding add-in 109 | _ReSharper*/ 110 | *.[Rr]e[Ss]harper 111 | *.DotSettings.user 112 | 113 | # JustCode is a .NET coding add-in 114 | .JustCode 115 | 116 | # TeamCity is a build add-in 117 | _TeamCity* 118 | 119 | # DotCover is a Code Coverage Tool 120 | *.dotCover 121 | 122 | # NCrunch 123 | _NCrunch_* 124 | .*crunch*.local.xml 125 | nCrunchTemp_* 126 | 127 | # MightyMoose 128 | *.mm.* 129 | AutoTest.Net/ 130 | 131 | # Web workbench (sass) 132 | .sass-cache/ 133 | 134 | # Installshield output folder 135 | [Ee]xpress/ 136 | 137 | # DocProject is a documentation generator add-in 138 | DocProject/buildhelp/ 139 | DocProject/Help/*.HxT 140 | DocProject/Help/*.HxC 141 | DocProject/Help/*.hhc 142 | DocProject/Help/*.hhk 143 | DocProject/Help/*.hhp 144 | DocProject/Help/Html2 145 | DocProject/Help/html 146 | 147 | # Click-Once directory 148 | publish/ 149 | 150 | # Publish Web Output 151 | *.[Pp]ublish.xml 152 | *.azurePubxml 153 | # TODO: Comment the next line if you want to checkin your web deploy settings 154 | # but database connection strings (with potential passwords) will be unencrypted 155 | *.pubxml 156 | *.publishproj 157 | 158 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 159 | # checkin your Azure Web App publish settings, but sensitive information contained 160 | # in these scripts will be unencrypted 161 | PublishScripts/ 162 | 163 | # NuGet Packages 164 | *.nupkg 165 | # The packages folder can be ignored because of Package Restore 166 | **/packages/* 167 | # except build/, which is used as an MSBuild target. 168 | !**/packages/build/ 169 | # Uncomment if necessary however generally it will be regenerated when needed 170 | #!**/packages/repositories.config 171 | # NuGet v3's project.json files produces more ignoreable files 172 | *.nuget.props 173 | *.nuget.targets 174 | 175 | # Microsoft Azure Build Output 176 | csx/ 177 | *.build.csdef 178 | 179 | # Microsoft Azure Emulator 180 | ecf/ 181 | rcf/ 182 | 183 | # Windows Store app package directories and files 184 | AppPackages/ 185 | BundleArtifacts/ 186 | Package.StoreAssociation.xml 187 | _pkginfo.txt 188 | 189 | # Visual Studio cache files 190 | # files ending in .cache can be ignored 191 | *.[Cc]ache 192 | # but keep track of directories ending in .cache 193 | !*.[Cc]ache/ 194 | 195 | # Others 196 | ClientBin/ 197 | ~$* 198 | *~ 199 | *.dbmdl 200 | *.dbproj.schemaview 201 | *.pfx 202 | *.publishsettings 203 | node_modules/ 204 | orleans.codegen.cs 205 | 206 | # Since there are multiple workflows, uncomment next line to ignore bower_components 207 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 208 | #bower_components/ 209 | 210 | # RIA/Silverlight projects 211 | Generated_Code/ 212 | 213 | # Backup & report files from converting an old project file 214 | # to a newer Visual Studio version. Backup files are not needed, 215 | # because we have git ;-) 216 | _UpgradeReport_Files/ 217 | Backup*/ 218 | UpgradeLog*.XML 219 | UpgradeLog*.htm 220 | 221 | # SQL Server files 222 | *.mdf 223 | *.ldf 224 | 225 | # Business Intelligence projects 226 | *.rdl.data 227 | *.bim.layout 228 | *.bim_*.settings 229 | 230 | # Microsoft Fakes 231 | FakesAssemblies/ 232 | 233 | # GhostDoc plugin setting file 234 | *.GhostDoc.xml 235 | 236 | # Node.js Tools for Visual Studio 237 | .ntvs_analysis.dat 238 | 239 | # Visual Studio 6 build log 240 | *.plg 241 | 242 | # Visual Studio 6 workspace options file 243 | *.opt 244 | 245 | # Visual Studio LightSwitch build output 246 | **/*.HTMLClient/GeneratedArtifacts 247 | **/*.DesktopClient/GeneratedArtifacts 248 | **/*.DesktopClient/ModelManifest.xml 249 | **/*.Server/GeneratedArtifacts 250 | **/*.Server/ModelManifest.xml 251 | _Pvt_Extensions 252 | 253 | # Paket dependency manager 254 | .paket/paket.exe 255 | paket-files/ 256 | 257 | # FAKE - F# Make 258 | .fake/ 259 | 260 | # JetBrains Rider 261 | .idea/ 262 | *.sln.iml 263 | --------------------------------------------------------------------------------