Differences
This shows you the differences between the selected revisions of the page.
| 2016-08-12 | 2016-09-29 | ||
| newer .net frameworks (martin) | Embedding WinSCP Executable as Resource (martin) | ||
| Line 79: | Line 79: | ||
| When deploying the assembly, make sure that WinSCP executable (''winscp.exe'') is deployed along with the assembly on the target system and that WinSCP assembly [[#installing|can find the executable]]. | When deploying the assembly, make sure that WinSCP executable (''winscp.exe'') is deployed along with the assembly on the target system and that WinSCP assembly [[#installing|can find the executable]]. | ||
| + | ===== [[resource]] Embedding WinSCP Executable as Resource ===== | ||
| + | |||
| + | If you want to avoid having the ''winscp.exe'' as a separate file (e.g. when whole your project is a single ''.exe'' file and you do not want to have any dependency), you can embed the ''winscp.exe'' as a resource to your own executable. | ||
| + | |||
| + | Add the ''winscp.exe'' to your Visual Studio project, if not added already (e.g. by the [[#nuget|WinSCP NuGet package]]). Change file property //Build Action// to the //Embedded Resource//. If the ''winscp.exe'' was added by the NuGet package, reset the property //Copy to Output Directory// back to the //Do not copy//. | ||
| + | |||
| + | Now, before you open a session, extract the ''winscp.exe'' from resources to a temporary file using a code like: | ||
| + | |||
| + | <code csharp> | ||
| + | // Generate random, yet meaningful name of the temporary file | ||
| + | string tempName = Path.GetTempFileName(); | ||
| + | string executableName = "WinSCP." + Path.ChangeExtension(Path.GetFileName(tempName), "exe"); | ||
| + | string executablePath = Path.Combine(Path.GetDirectoryName(tempName), executableName); | ||
| + | File.Delete(tempName); | ||
| + | |||
| + | // Extract the resource to the temporary file | ||
| + | Assembly executingAssembly = Assembly.GetExecutingAssembly(); | ||
| + | string resourceName = executingAssembly.GetName().Name + "." + "WinSCP.exe"; | ||
| + | |||
| + | using (Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) | ||
| + | using (Stream file = new FileStream(executablePath, FileMode.Create, FileAccess.Write)) | ||
| + | { | ||
| + | resource.CopyTo(file); | ||
| + | } | ||
| + | |||
| + | try | ||
| + | { | ||
| + | using (Session session = new Session()) | ||
| + | { | ||
| + | // Use the temporarily extracted executable | ||
| + | session.ExecutablePath = executablePath; | ||
| + | |||
| + | // Connect | ||
| + | session.Open(sessionOptions); | ||
| + | |||
| + | // Your code | ||
| + | } | ||
| + | } | ||
| + | finally | ||
| + | { | ||
| + | // Clean up | ||
| + | File.Delete(executablePath); | ||
| + | } | ||
| + | </code> | ||