From 17765a772fd763ae2df0239325923aaf4a248957 Mon Sep 17 00:00:00 2001 From: clowwindy Date: Thu, 6 Nov 2014 01:55:37 +0800 Subject: [PATCH] embed polarssl into exe --- shadowsocks-csharp/PolipoRunner.cs | 9 ++++++++- shadowsocks-csharp/Program.cs | 15 ++++++++++++--- shadowsocks-csharp/Properties/AssemblyInfo.cs | 8 ++++---- shadowsocks-csharp/Properties/Resources.Designer.cs | 10 ++++++++++ shadowsocks-csharp/Properties/Resources.resx | 3 +++ shadowsocks-csharp/polarssl.dll.gz | Bin 0 -> 18561 bytes shadowsocks-csharp/shadowsocks-csharp.csproj | 1 + 7 files changed, 38 insertions(+), 8 deletions(-) create mode 100755 shadowsocks-csharp/polarssl.dll.gz diff --git a/shadowsocks-csharp/PolipoRunner.cs b/shadowsocks-csharp/PolipoRunner.cs index e99e956d..c7bb1cdc 100755 --- a/shadowsocks-csharp/PolipoRunner.cs +++ b/shadowsocks-csharp/PolipoRunner.cs @@ -90,7 +90,14 @@ namespace shadowsocks_csharp if (process != null) { process.Kill(); - process.WaitForExit(); + try + { + process.WaitForExit(); + } + catch (InvalidOperationException) + { + // do nothing + } process = null; } } diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index 12cf932d..7e27dd4a 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -1,12 +1,17 @@ -using System; +using shadowsocks_csharp.Properties; +using System; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace shadowsocks_csharp { static class Program { + [DllImport("Kernel32.dll")] + private static extern IntPtr LoadLibrary(string path); + /// /// 应用程序的主入口点。 /// @@ -14,14 +19,18 @@ namespace shadowsocks_csharp static void Main() { try - { + { + string tempPath = Path.GetTempPath(); + string dllPath = tempPath + "/polarssl.dll"; + PolipoRunner.UncompressFile(dllPath, Resources.polarssl_dll); + LoadLibrary(dllPath); + FileStream fs = new FileStream("shadowsocks.log", FileMode.Append); TextWriter tmp = Console.Out; StreamWriter sw = new StreamWriter(fs); sw.AutoFlush = true; Console.SetOut(sw); Console.SetError(sw); - } catch (IOException e) { diff --git a/shadowsocks-csharp/Properties/AssemblyInfo.cs b/shadowsocks-csharp/Properties/AssemblyInfo.cs index d2b3f770..4fe88580 100755 --- a/shadowsocks-csharp/Properties/AssemblyInfo.cs +++ b/shadowsocks-csharp/Properties/AssemblyInfo.cs @@ -5,11 +5,11 @@ using System.Runtime.InteropServices; // 有关程序集的常规信息通过下列属性集 // 控制。更改这些属性值可修改 // 与程序集关联的信息。 -[assembly: AssemblyTitle("shadowsocks-csharp")] +[assembly: AssemblyTitle("Shadowsocks")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("clowwindy")] -[assembly: AssemblyProduct("shadowsocks-csharp")] +[assembly: AssemblyProduct("Shadowsocks")] [assembly: AssemblyCopyright("Copyright © clowwindy 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, // 方法是按如下所示使用“*”: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.2")] -[assembly: AssemblyFileVersion("1.1.2")] +[assembly: AssemblyVersion("2.0.0")] +[assembly: AssemblyFileVersion("2.0.0")] diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index 0de6d85c..ca8cb5fb 100755 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -61,6 +61,16 @@ namespace shadowsocks_csharp.Properties { } /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] polarssl_dll { + get { + object obj = ResourceManager.GetObject("polarssl_dll", resourceCulture); + return ((byte[])(obj)); + } + } + + /// /// Looks up a localized string similar to # Sample configuration file for Polipo. -*-sh-*- /// ///# You should not need to use a configuration file; all configuration diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index a716e86e..97ca7965 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\polarssl.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\config.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 diff --git a/shadowsocks-csharp/polarssl.dll.gz b/shadowsocks-csharp/polarssl.dll.gz new file mode 100755 index 0000000000000000000000000000000000000000..1010242ef73fd149b2f1c016fbae9fc253a32507 GIT binary patch literal 18561 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 z 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 HRh|FTrue + SettingsSingleFileGenerator