我正在开发一个现代的WPF应用程序。我想使用TaskDialog,但我总是得到常见的错误:
TaskDialog功能需要加载comctl32.dll的第6版但是a 当前在内存中加载了不同的版本。
我尝试添加一个清单(已包含正确的comctl32.dll所需的依赖关系)并将其设置为项目属性中的默认清单。
它仍会抛出此异常: - /
我的应用程序是这样构建的: 这是一个启动应用程序(正常的Windows应用程序,非wpf)。它只有“Program.cs”这是入口点。它动态加载真实的应用程序(这是一个库,而不是WPF应用程序项目)。它调用启动应用程序的启动方法。
效果很好,但我总是得到这个例外。我想这是因为这个启动系统......但是解决它的可行方法是什么?
非常感谢:)
[R
答案 0 :(得分:3)
运行程序的* .exe版本,而不是Visual Studio * .vshost.exe
的版本要在Visual Studio中执行此操作,请在“调试/启用调试器/启用Visual Studio主机进程”中禁用该标志
答案 1 :(得分:2)
也许我的解决方案会帮助你。
My C#“application”是一个类库/ dll,用作WIX的CustomAction。我想要一个TaskDialog而不是MessageBox,但我遇到了和你一样的异常,据我所知,清单文件对C#类库不起作用。我不得不使用各种组合来获取正确版本的comctl32.dll。
我刚刚开始工作,所以我的代码有点混乱和肥胖。
<强>来源:强>
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。结果强>
答案 2 :(得分:0)
我发现如果你以“RequireAdministrator”权限运行它会抛出异常,但是如果允许“AsInvoker”则不会抛出异常。只是我的观察。如果您的应用需要管理员权限,那么我就难倒了