Заставка 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.

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

Не могли бы вы, ребята, дать совет? Есть ли какие-то особенности в конфигурации, применимые к .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();
            }
        }


    }
}

person Windrider    schedule 04.08.2017    source источник


Ответы (1)


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

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

Пытаться:

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

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

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

person Jeremy Thompson    schedule 05.08.2017
comment
Спасибо за наводки, очень признателен. Перевод французского exception.message : сборка в смешанном режиме создается с версией среды выполнения «v1.1.4322» и не может быть загружена в среде выполнения 4.0 без другой информации о конфигурации. Означает ли это, что .scr на самом деле не учитывает Screensaver.scr.config или есть другая конфигурация, о которой я не знаю? Я знаю, что я должен изменить свой двигатель. Я просто программист-любитель, который слишком удобен в своих старых вещах, и действительно, я немного встряхнусь, чтобы обновиться... - person Windrider; 05.08.2017
comment
Сборка в смешанном режиме? Неуправляемая/управляемая? Попробуйте заставить его работать в приложении WinForm, также установлен .net 1.1? - person Jeremy Thompson; 05.08.2017
comment
Да, я много раз работал с другими кодами. Работает в винформе. Просто не при запуске по таймеру заставки Windows... - person Windrider; 05.08.2017
comment
CC поставщика, под отладчиком это может быть быстрое решение для них в VS2003 - person Jeremy Thompson; 05.08.2017
comment
на таком старом движке.... У меня будет более быстрое решение, переключившееся на другую библиотеку! :) - person Windrider; 05.08.2017
comment
Я приму ваш ответ как решение, поскольку, хотя проблема не была устранена, ответ был способом точно определить проблему. спасибо за помощь. - person Windrider; 05.08.2017