Заставка C# с унаследованным.NET 3DEngine - сборка конфигурации

Я написал кодовую заставку C#, которая работает в режиме предварительного просмотра (установки), конфигурации или даже в тестовом режиме. Однако при достижении таймера Windows для его запуска экран становится черным, я вижу значок загрузки мыши в течение 2-3 секунд, а затем экран возвращается на рабочий стол.

Я добавляю запись файла журнала в качестве первой строки кода в моем main() и кажется, что этот код никогда не запускается при запуске Windows.

Использование Visual studio 2017 на Windows 10.

Поскольку я использую старый 3D-движок, я позаботился о том, чтобы изменить app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <startup useLegacyV2RuntimeActivationPolicy="true"> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      <supportedRuntime version="v1.1.4322"/>
    </startup>
</configuration>

Я переименовал Screensaver.exe в Screensaver.scr вместе с app.config в Screensaver.scr.config. Скопировал их с моим движком DLL в папке SysWOW64.

Целевая пластина, цель = x86.

Я пробовал как отладку, так и сборку релиза... И я использовал ту же структуру кода, чтобы сделать простой пример заставки, отображающей текст, и это сработало, поэтому я действительно думаю, что проблема связана с использованием 3D-движка dll.

Ребята, есть ли у вас какие-нибудь советы? Есть ли какие-то особенности в конфигурации, которая применяется к.scr? Не могу найти нигде, и я не в себе....

Вот основной код, если он может помочь:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using TV3D;

namespace ScreenSaver
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            LogMessageToFile("Hello, World");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            CLTV3D tv3d = new CLTV3D();

            if (args.Length > 0)
            {
                string firstArgument = args[0].ToLower().Trim();
                string secondArgument = null;

                // Handle cases where arguments are separated by colon.
                // Examples: /c:1234567 or /P:1234567
                if (firstArgument.Length > 2)
                {
                    secondArgument = firstArgument.Substring(3).Trim();
                    firstArgument = firstArgument.Substring(0, 2);
                }
                else if (args.Length > 1)
                    secondArgument = args[1];

                if (firstArgument == "/c")           // Configuration mode
                {
                    Application.Run(new ScreenSaverSettingsForm());
                }
                else if (firstArgument == "/p")      // Preview mode
                {
                    if (secondArgument == null)
                    {
                        MessageBox.Show("Sorry, but the expected window handle was not provided.",
                            "ScreenSaver", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    IntPtr previewWndHandle = new IntPtr(long.Parse(secondArgument));
                    Application.Run(new TVForm(previewWndHandle, tv3d));


                }
                else if (firstArgument == "/s")      // Full-screen mode
                {
                    tv3d.TV.AddToLog("full screen mode argument detected");

                    foreach (Screen screen in Screen.AllScreens)
                    {
                        TVForm tv = new TVForm(screen.Bounds, screen.DeviceName, tv3d);
                        tv.Show();
                    }
                    Application.Run();
                }
                else    // Undefined argument
                {
                    MessageBox.Show("Sorry, but the command line argument \"" + firstArgument +
                        "\" is not valid.", "ScreenSaver",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else    // No arguments - treat like /c
            {
                Application.Run(new ScreenSaverSettingsForm());
            }
        }



        static public string GetTempPath()
        {
            string path = System.Environment.GetEnvironmentVariable("TEMP");
            if (!path.EndsWith("\\")) path += "\\";
            return path;
        }

        static public void LogMessageToFile(string msg)
        {
            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + "My Log File.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }


    }
}

1 ответ

Решение

Похоже, вы сузили его до 3D-компонента.

Без файла журнала вы можете быть уверены, что приложение не запускается, а без сообщения об ошибке сложно определить причину. Вот несколько шагов по устранению неполадок.

Пытаться:

  • журналы событий для подсказок,
  • "поздно связать" CLTV3D с помощью Assembly.Load в Try/Catch,
  • запуск ProcessMonitor показывает, почему он не работает.

Если вышеперечисленное не работает, настройте DebugDiag (или AdPlus с WinDbg и SOS) и проанализируйте аварийный дамп.

В противном случае.Net 1.1, как 15 лет!!! Сделайте себе одолжение, будет намного проще использовать современную библиотеку.

Другие вопросы по тегам