├── .gitattributes ├── .gitignore ├── LICENSE.txt ├── README.md ├── lib └── edge-powershell.js ├── package.json ├── samples └── tryPowerShell │ ├── GetEventLog.ps1 │ ├── GetRegistry.ps1 │ ├── Invoke-PSNode.ps1 │ ├── Set-EdgeEnv.ps1 │ ├── getRegistry.js │ ├── getbios.ps1 │ ├── getprocess.ps1 │ ├── server.js │ ├── test.js │ ├── test.ps1 │ ├── test1.js │ ├── testMultiply.js │ ├── testObject.ps1 │ ├── tryPowerShell.ps1 │ └── webservice.ps1 └── src └── Edge.PowerShell ├── Edge.PowerShell.sln └── Edge.PowerShell ├── Edge.PowerShell.csproj ├── EdgePowerShell.cs └── Properties └── AssemblyInfo.cs /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | #packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | 165 | # node installs 166 | node_modules -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2013 Doug Finke 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Run PowerShell in node.js 2 | =============== 3 | 4 | [Edge](https://github.com/tjanczuk/edge) allows you to run .NET and node.js code in one process. You can call .NET functions from node.js and node.js functions from .NET. Edge takes care of marshaling data between CLR and V8. Edge also reconciles threading models of single threaded V8 and multi-threaded CLR. 5 | 6 | edge-powershell 7 | =============== 8 | Is an experiment to execute PowerShell scripts from a node.js app. 9 | 10 | [Follow @dfinke](https://twitter.com/dfinke) 11 | 12 | How 13 | === 14 | Install [node.js](http://nodejs.org/) 15 | 16 | Then, from the edge-powershell directory, run: 17 | ``` 18 | npm install 19 | ``` 20 | Build the VS solution 21 | ``` 22 | src\Edge.PowerShell\Edge.PowerShell.sln 23 | ``` 24 | From the directory edge-powershell\samples\tryPowerShell, set this variable in PowerShell 25 | 26 | ``` 27 | $env:EDGE_POWERSHELL_NATIVE='..\..\src\Edge.PowerShell\Edge.PowerShell\bin\Debug\Edge.PowerShell.dll' 28 | ``` 29 | 30 | Then from edge-powershell\samples\tryPowerShell 31 | 32 | ``` 33 | node .\test.js 34 | 35 | [ 'Hello World' ] 36 | ``` 37 | 38 | Other examples 39 | === 40 | The results returned are json 41 | ``` 42 | node .\test.js 1..10 43 | [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 44 | ``` 45 | 46 | ``` 47 | node .\test.js 1..10 | ConvertFrom-Json 48 | 1 49 | 2 50 | 3 51 | 4 52 | 5 53 | 6 54 | 7 55 | 8 56 | 9 57 | 10 58 | ``` 59 | 60 | Use JavaScript and act on the results from PowerShell 61 | === 62 | Here you pass in the range **_1..5_** to PowerShell, it returns a json array. You can then use **_forEach_** on it and print it. 63 | 64 | ``` 65 | var edge = require('../../lib/g-powershell.js') 66 | 67 | var script = "1..5"; 68 | 69 | edge.powerShell(script, function (error, result) { 70 | if (error) throw error; 71 | 72 | result.forEach(function(item) { 73 | console.log(item*2); 74 | }); 75 | }); 76 | ``` 77 | 78 | Run it 79 | 80 | ``` 81 | node .\testMultiply.js 82 | 83 | 2 84 | 4 85 | 6 86 | 8 87 | 10 88 | ``` 89 | 90 | Known issues 91 | === 92 | I'm still working on marshaling the data from PowerShell back to nodejs. PowerShell and the JavaScript serialization are not playing well. 93 | So, the following will not produce the correct results. 94 | ``` 95 | node .\test.js Get-Process 96 | ``` 97 | 98 | ``` 99 | node .\test.js 'Get-Process' 100 | ``` 101 | 102 | ## Displays the correct string output 103 | But requires the **_Out-String_**. Plus, it would be prefered to get the powershell objects back to the pipeline. 104 | 105 | ``` 106 | node .\test.js 'Get-Process | where handles -gt 700 | Out-string' | ConvertFrom-Json 107 | 108 | Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName 109 | ------- ------ ----- ----- ----- ------ -- ----------- 110 | 1444 86 94812 126244 425 11.45 2840 chrome 111 | 1249 91 61316 10832 444 563.16 3988 communicator 112 | 2282 155 74328 128816 707 64.66 2376 explorer 113 | 944 80 151224 174228 596 20.98 3176 GitHub 114 | 913 47 17488 10736 1063 5.27 4768 LiveComm 115 | 1064 25 7316 11280 53 18.95 580 lsass 116 | 712 69 36620 37120 613 96.81 3400 SearchIndexer 117 | 717 35 109616 96392 172 984.39 340 svchost 118 | 940 47 22804 28088 1482 57.84 408 svchost 119 | 833 32 19624 21568 110 19.61 884 svchost 120 | 1924 65 207928 47048 404 90.20 952 svchost 121 | 820 37 13784 17988 115 8.63 984 svchost 122 | 848 0 168 19284 29 1,232.98 4 System 123 | 774 26 15920 15368 109 4.78 5024 wmpnetwk 124 | ``` 125 | -------------------------------------------------------------------------------- /lib/edge-powershell.js: -------------------------------------------------------------------------------- 1 | var edge = require('edge'); 2 | 3 | exports.powerShell = edge.func({ 4 | assemblyFile: process.env.EDGE_POWERSHELL_NATIVE || (__dirname + '\\clr\\Edge.PowerShell.dll'), 5 | typeName: 'Edge.PS.EdgePowerShell', 6 | methodName: 'InvokeScript' 7 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "edge-powershell", 3 | "author": { 4 | "name": "Doug Finke ", 5 | "url": "http://dougfinke.com", 6 | "twitter": "dfinke" 7 | }, 8 | "version": "0.1.0", 9 | "description": "Implement node.js PowerShell using Edge", 10 | "tags" : ["edge", "net", "clr", "c#", "managed", ".net", "powershell", "middleware"], 11 | "main": "./lib/edge-powershell.js", 12 | "engines": { "node": "0.8.x" }, 13 | "licenses": [ { "type": "Apache", "url": "http://www.apache.org/licenses/LICENSE-2.0" } ], 14 | "dependencies": { 15 | "edge": "0.7.0" 16 | }, 17 | "homepage": "https://github.com/dfinke/edge-powershell", 18 | "repository": { 19 | "type": "git", 20 | "url": "git@github.com:dfinke/edge-powershell.git" 21 | }, 22 | "bugs" : { 23 | "url" : "https://github.com/dfinke/edge-powershell/issues" 24 | }, 25 | "scripts": { 26 | } 27 | } -------------------------------------------------------------------------------- /samples/tryPowerShell/GetEventLog.ps1: -------------------------------------------------------------------------------- 1 | Get-EventLog -LogName Application | select -first 3 -------------------------------------------------------------------------------- /samples/tryPowerShell/GetRegistry.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | $path = "HKLM:\SOFTWARE\Microsoft\MSBuild", 3 | $property = "MSBuildOverrideTasksPath" 4 | ) 5 | 6 | (Get-ChildItem $path | Get-ItemProperty).$property -------------------------------------------------------------------------------- /samples/tryPowerShell/Invoke-PSNode.ps1: -------------------------------------------------------------------------------- 1 | function Invoke-PSNode { 2 | param( 3 | $script, 4 | [Switch]$NoConversion 5 | ) 6 | 7 | if(!$env:EDGE_POWERSHELL_NATIVE) { 8 | $env:EDGE_POWERSHELL_NATIVE = '..\..\src\Edge.PowerShell\Edge.PowerShell\bin\Debug\Edge.PowerShell.dll' 9 | } 10 | 11 | if($NoConversion) { 12 | node .\test.js $script 13 | } else { 14 | ((node .\test.js $script) -join '' | ConvertFrom-Json ).result 15 | } 16 | } -------------------------------------------------------------------------------- /samples/tryPowerShell/Set-EdgeEnv.ps1: -------------------------------------------------------------------------------- 1 | $env:EDGE_POWERSHELL_NATIVE = '..\..\src\Edge.PowerShell\Edge.PowerShell\bin\Debug\Edge.PowerShell.dll' -------------------------------------------------------------------------------- /samples/tryPowerShell/getRegistry.js: -------------------------------------------------------------------------------- 1 | var edge = require('../../lib/edge-powershell.js') 2 | 3 | function getRegistryInfo(path, property) { 4 | return { 5 | script: "GetRegistry", 6 | parameters: { 7 | path: path, 8 | property: property 9 | } 10 | }; 11 | } 12 | 13 | var path = '"HKLM:\\SOFTWARE\\Microsoft\\Windows Search"'; 14 | var property = 'ierss'; 15 | 16 | edge.powerShell(getRegistryInfo(path, property), function (error, results) { 17 | 18 | if (error) throw error; 19 | console.log(results); 20 | }); 21 | -------------------------------------------------------------------------------- /samples/tryPowerShell/getbios.ps1: -------------------------------------------------------------------------------- 1 | Get-WmiObject win32_bios #| Select SMBIOSBIOSVersion, Manufacturer,Name,SerialNumber,Version -------------------------------------------------------------------------------- /samples/tryPowerShell/getprocess.ps1: -------------------------------------------------------------------------------- 1 | ps -------------------------------------------------------------------------------- /samples/tryPowerShell/server.js: -------------------------------------------------------------------------------- 1 | var edge = require('../../lib/edge-powershell.js') 2 | var express = require('express'); 3 | 4 | var app = express(); 5 | var port = process.env.PORT || 8080; 6 | 7 | //function wrapScript(script) { 8 | // return '.\\' + script + '.ps1'; 9 | //} 10 | app.get('/powershell/:script', function(req,res) { 11 | 12 | var payload = { 13 | //script: wrapScript(req.params.script), 14 | script: req.params.script, 15 | parameters: req.query 16 | //request: req, 17 | //response: res, 18 | } 19 | edge.powerShell(payload, function (error, results) { 20 | if (error) return console.log(error); 21 | res.json(results.Result); 22 | }); 23 | }); 24 | 25 | app.listen(port); 26 | console.log("Server listening on port " + port); 27 | -------------------------------------------------------------------------------- /samples/tryPowerShell/test.js: -------------------------------------------------------------------------------- 1 | var edge = require('../../lib/edge-powershell.js') 2 | 3 | var script = process.argv.splice(2)[0] || "'Hello World'"; 4 | 5 | edge.powerShell(script, function (error, result) { 6 | if (error) throw error; 7 | console.log(result); 8 | }); 9 | -------------------------------------------------------------------------------- /samples/tryPowerShell/test.ps1: -------------------------------------------------------------------------------- 1 | param($min=1,$max=20) 2 | 3 | #[System.Console]::WriteLine($min) 4 | #[System.Console]::WriteLine($max) 5 | 6 | $min..$max | ? {$_ % 2 -eq 0} | % {$_*$_} -------------------------------------------------------------------------------- /samples/tryPowerShell/test1.js: -------------------------------------------------------------------------------- 1 | //var edge = require('../../lib/edge-powershell.js') 2 | var edge = require('edge'); 3 | 4 | var x = edge.func(function(){/* 5 | 'test' 6 | */}); 7 | 8 | x(); -------------------------------------------------------------------------------- /samples/tryPowerShell/testMultiply.js: -------------------------------------------------------------------------------- 1 | //var owin = require('../../lib/owin-powershell.js') 2 | 3 | //var script = "1..5"; 4 | 5 | //powerShell(script, function (error, result) { 6 | // if (error) throw error; 7 | // 8 | // result.forEach(function(item) { 9 | // console.log(item*2); 10 | // }); 11 | //}); 12 | -------------------------------------------------------------------------------- /samples/tryPowerShell/testObject.ps1: -------------------------------------------------------------------------------- 1 | #dir | select Mode, LastWriteTime, Length, Name | convertto-json 2 | #ps 3 | 4 | #@{Name='John'; Age=10;dir=ls|select name} 5 | #[pscustomobject] @{ 6 | # Name = 'John' 7 | # Age = 10 8 | #} #| Out-String # ConvertTo-Json 9 | #'Test' 10 | 11 | 12 | dir | % { 13 | @{ 14 | Mode = $_.Mode 15 | LastWriteTime=$_.LastWriteTime 16 | Length=$_.Length 17 | Name=$_.Name 18 | } 19 | } | out-string -------------------------------------------------------------------------------- /samples/tryPowerShell/tryPowerShell.ps1: -------------------------------------------------------------------------------- 1 | 2 | param($number=10) 3 | 4 | filter sqr {$_*$_} 5 | 6 | 1..$number | 7 | where {$_ % 2 -eq 0} | 8 | sqr -------------------------------------------------------------------------------- /samples/tryPowerShell/webservice.ps1: -------------------------------------------------------------------------------- 1 | param($weight, $from, $to) 2 | 3 | $obj = New-WebServiceProxy http://www.webservicex.net/ConvertWeight.asmx 4 | $obj.ConvertWeight($weight, $from, $to) -------------------------------------------------------------------------------- /src/Edge.PowerShell/Edge.PowerShell.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2012 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Edge.PowerShell", "Edge.PowerShell\Edge.PowerShell.csproj", "{D5A5DF8F-2B03-4E7F-95EC-96A022A16DE0}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {D5A5DF8F-2B03-4E7F-95EC-96A022A16DE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {D5A5DF8F-2B03-4E7F-95EC-96A022A16DE0}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {D5A5DF8F-2B03-4E7F-95EC-96A022A16DE0}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {D5A5DF8F-2B03-4E7F-95EC-96A022A16DE0}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /src/Edge.PowerShell/Edge.PowerShell/Edge.PowerShell.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {D5A5DF8F-2B03-4E7F-95EC-96A022A16DE0} 8 | Library 9 | Properties 10 | Edge.PS 11 | Edge.PowerShell 12 | v4.5 13 | 512 14 | 15 | 16 | true 17 | full 18 | false 19 | bin\Debug\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | 24 | 25 | pdbonly 26 | true 27 | bin\Release\ 28 | TRACE 29 | prompt 30 | 4 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 54 | -------------------------------------------------------------------------------- /src/Edge.PowerShell/Edge.PowerShell/EdgePowerShell.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Management.Automation; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace Edge.PS 10 | { 11 | public class EdgePowerShell 12 | { 13 | public async Task InvokeScript(object input) 14 | { 15 | var powerShell = PowerShell.Create(); 16 | var payload = input as IDictionary; 17 | 18 | var script = payload == null ? GetScriptFromInput(input.ToString()) : GetScriptFromPayload(payload); 19 | 20 | powerShell.AddScript(script); 21 | powerShell.AddCommand("Out-String"); 22 | 23 | var outputs = await Task.Factory.FromAsync, PSInvocationSettings, PSDataCollection>( 24 | powerShell.BeginInvoke, 25 | powerShell.EndInvoke, 26 | new PSDataCollection(), 27 | new PSInvocationSettings(), 28 | null, 29 | TaskCreationOptions.None); 30 | 31 | var results = outputs.Select(psobject => psobject).ToList(); 32 | return Task.FromResult(results); 33 | } 34 | 35 | private string GetScriptFromInput(string input) 36 | { 37 | return GetScriptFile(input); 38 | } 39 | 40 | private string GetScriptFile(string script) 41 | { 42 | var tmpScript = string.Format(@".\{0}.ps1", script); 43 | return File.Exists(tmpScript) ? tmpScript : script; 44 | } 45 | 46 | private string GetScriptFromPayload(IDictionary payload) 47 | { 48 | var script = GetScriptFile(payload["script"] as string); 49 | 50 | var targetScript = script; 51 | 52 | if (payload.ContainsKey("parameters")) 53 | { 54 | var parameters = payload["parameters"] as Dictionary; 55 | 56 | var sb = new StringBuilder(script); 57 | 58 | foreach (var item in parameters) 59 | { 60 | sb.AppendFormat(" -{0} {1} ", item.Key, item.Value); 61 | } 62 | 63 | targetScript = sb.ToString(); 64 | 65 | } 66 | 67 | //Console.WriteLine("script: {0}", targetScript); 68 | 69 | return targetScript; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/Edge.PowerShell/Edge.PowerShell/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Edge.PowerShell")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Edge.PowerShell")] 13 | [assembly: AssemblyCopyright("Copyright © 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("cfec0e1a-960f-4a9e-b9ca-48305b769738")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | --------------------------------------------------------------------------------