0

リソース「WindowsFormsApplication1.exe」に2つのWinForms NETアプリケーション「Test.exe」があります。リソースは「埋め込み」としてマークされています。プログラム リソース - 空白のプロジェクト Winforms (ハンドラーのないフォームとボタンのみ)。「Test.exe」で共通コードを使用します。

 private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            RunInternalExe("WindowsFormsApplication1.exe");
        }
   private static void RunInternalExe(string exeName)
        {
            //Get the current assembly
            Assembly assembly = Assembly.GetExecutingAssembly();

            //Get the assembly's root name
            string rootName = assembly.GetName().Name;

            //Get the resource stream
            Stream resourceStream = assembly.GetManifestResourceStream(rootName + "." + exeName);

            //Verify the internal exe exists
            if (resourceStream == null)
                return;

            //Read the raw bytes of the resource
            byte[] resourcesBuffer = new byte[resourceStream.Length];

            resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length);
            resourceStream.Close();

            //Load the bytes as an assembly
            Assembly exeAssembly = Assembly.Load(resourcesBuffer);

            //Execute the assembly
            exeAssembly.EntryPoint.Invoke(null, null); //no parameters
        }

リソースから EXE を実行しようとすると、次の行に "TargetInvocationException" というエラーが表示されます。

 exeAssembly.EntryPoint.Invoke(null, null);
4

1 に答える 1

0

解決策を見つけました。リソース プログラムのフォームが同じスレッドで作成されました。この場合、次のようなコードを使用する必要があります。

    private void button1_Click(object sender, EventArgs e)
        {
        this.Hide();
        Thread t = new Thread(new ParameterizedThreadStart(RunInternalExe));
        t.Start("RunCodeFromDll.exe");

        //RunInternalExe("RunCodeFromDll.exe");
        }
    static void RunInternalExe(object tempName)
        {
        string exeName = tempName.ToString();
        //Get the current assembly
        Assembly assembly = Assembly.GetExecutingAssembly();

        //Get the assembly's root name
        string rootName = assembly.GetName().Name;

        //Get the resource stream
        Stream resourceStream = assembly.GetManifestResourceStream(rootName + "." + exeName);

        //Verify the internal exe exists
        if (resourceStream == null)
            return;

        //Read the raw bytes of the resource
        byte[] resourcesBuffer = new byte[resourceStream.Length];

        resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length);
        resourceStream.Close();

        //Load the bytes as an assembly
        Assembly exeAssembly = Assembly.Load(resourcesBuffer);

        //Execute the assembly
        exeAssembly.EntryPoint.Invoke(null, null); //.EntryPoint.Invoke(null, null); //no parameters
        }

私はもっ​​と気をつけなければなりません。))))

于 2013-06-13T17:25:08.783 に答える