6

我正在开发一个现代 WPF 应用程序。我想使用TaskDialog,但我总是遇到常见错误:

TaskDialog 功能需要加载 comctl32.dll 的版本 6,但当前在内存中加载了不同的版本。

我尝试添加一个清单(它已经包含正确的 comctl32.dll 所需的依赖项)并将其设置为项目属性中的默认清单。

它仍然抛出这个异常:-/

我的应用程序是这样构建的:它是一个启动应用程序(普通的 Windows 应用程序,非 wpf)。它只有作为入口点的“Program.cs”。它在那里动态加载真正的应用程序(这是一个库,而不是 WPF 应用程序项目)。它调用启动应用程序的启动方法。

效果很好,但我总是得到这个例外。我想这是因为这个启动系统......但是解决它的可能解决方法是什么?

非常感谢 :)

R

4

3 回答 3

3

运行程序的 *.exe 版本,而不是 Visual Studio *.vshost.exe 的版本

要在 Visual Studio 中执行此操作,请禁用“调试/启用调试器/启用 Visual Studio 托管进程”中的标志

于 2013-09-19T13:09:42.260 回答
3

也许我的解决方案会对你有所帮助。

我的 C#“应用程序”是用作 WIX 的 CustomAction 的类库/dll。我想要一个 TaskDialog 而不是 MessageBox,但我遇到了和你一样的异常,据我所知,清单文件不适用于 C# 类库。我不得不使用多种方法来让我的代码加载正确版本的 comctl32.dll。

我刚刚开始工作,所以我的代码有点凌乱和肥胖。

资料来源:

  1. http://truecheaters.com/f51/%5Bc-%5D-taskdialog-9368.html
  2. http://support.microsoft.com/kb/830033

1) 包括上面第二个链接中的 EnableThemingInScope 类。

2)包括这个修改后的TaskDialog枚举/类:

[Flags]
public enum TaskDialogButtons {
    OK = 0x0001,
    Cancel = 0x0008,
    Yes = 0x0002,
    No = 0x0004,
    Retry = 0x0010,
    Close = 0x0020
}

public enum TaskDialogIcon {
    Information = UInt16.MaxValue - 2,
    Warning = UInt16.MaxValue,
    Stop = UInt16.MaxValue - 1,
    Question = 0,
    SecurityWarning = UInt16.MaxValue - 5,
    SecurityError = UInt16.MaxValue - 6,
    SecuritySuccess = UInt16.MaxValue - 7,
    SecurityShield = UInt16.MaxValue - 3,
    SecurityShieldBlue = UInt16.MaxValue - 4,
    SecurityShieldGray = UInt16.MaxValue - 8
}

public enum TaskDialogResult {
    None,
    OK,
    Cancel,
    Yes,
    No,
    Retry,
    Close
}

public class StatusDialog {
    #region API
    [DllImport( "comctl32.dll", CharSet = CharSet.Unicode )]
    public static extern int TaskDialog( IntPtr hWndParent, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, int dwCommonButtons, IntPtr pszIzon, out int pnButton );
    #endregion

    #region Modal
    public static TaskDialogResult Show( IWin32Window owner, string text ) {
        return Show( owner, text, null, null, TaskDialogButtons.OK );
    }

    public static TaskDialogResult Show( IWin32Window owner, string text, string instruction ) {
        return Show( owner, text, instruction, null, TaskDialogButtons.OK, 0 );
    }

    public static TaskDialogResult Show( IWin32Window owner, string text, string instruction, string caption ) {
        return Show( owner, text, instruction, caption, TaskDialogButtons.OK, 0 );
    }

    public static TaskDialogResult Show( IWin32Window owner, string text, string instruction, string caption, TaskDialogButtons buttons ) {
        return Show( owner, text, instruction, caption, buttons, 0 );
    }

    public static TaskDialogResult Show( IWin32Window owner, string text, string instruction, string caption, TaskDialogButtons buttons, TaskDialogIcon icon ) {
        return ShowInternal( owner.Handle, text, instruction, caption, buttons, icon );
    }
    #endregion

    #region Non-Modal
    public static TaskDialogResult Show( string text ) {
        return Show( text, null, null, TaskDialogButtons.OK );
    }

    public static TaskDialogResult Show( string text, string instruction ) {
        return Show( text, instruction, null, TaskDialogButtons.OK, 0 );
    }

    public static TaskDialogResult Show( string text, string instruction, string caption ) {
        return Show( text, instruction, caption, TaskDialogButtons.OK, 0 );
    }

    public static TaskDialogResult Show( string text, string instruction, string caption, TaskDialogButtons buttons ) {
        return Show( text, instruction, caption, buttons, 0 );
    }

    public static TaskDialogResult Show( string text, string instruction, string caption, TaskDialogButtons buttons, TaskDialogIcon icon ) {
        return ShowInternal( IntPtr.Zero, text, instruction, caption, buttons, icon );
    }
    #endregion

    #region Core Implementation
    private static TaskDialogResult ShowInternal( IntPtr owner, string text, string instruction, string caption, TaskDialogButtons buttons, TaskDialogIcon icon ) {
        int p;
        using ( new EnableThemingInScope( true ) ) {
            int resss = TaskDialog( owner, IntPtr.Zero, caption, instruction, text, (int) buttons, new IntPtr( (int) icon ), out p );
            if ( resss != 0 )
                throw new InvalidOperationException( "Something weird has happened." + resss.ToString() );
        }

        switch ( p ) {
            case 1:
                return TaskDialogResult.OK;
            case 2:
                return TaskDialogResult.Cancel;
            case 4:
                return TaskDialogResult.Retry;
            case 6:
                return TaskDialogResult.Yes;
            case 7:
                return TaskDialogResult.No;
            case 8:
                return TaskDialogResult.Close;
            default:
                return TaskDialogResult.None;
        }
    }
    #endregion
}

3. 调用它,简单地说:

try {
    StatusDialog.Show( "About to test this...", "Heading I won't use.", "Dialog Title", TaskDialogButtons.OK );
} catch ( Exception e ) {
    MessageBox.Show( e.ToString(), "Error Found", MessageBoxButtons.OK );
}

4. 结果:

在此处输入图像描述

于 2013-05-11T05:45:53.967 回答
0

我发现如果您以“RequireAdministrator”权限运行,它会抛出异常,但如果权限“AsInvoker”则不会抛出异常。只是我的观察。如果您的应用程序需要管理员权限,那么我很难过

于 2015-11-18T22:31:28.770 回答