我正在用C#编写一个允许清除默认打印机队列的应用程序。
为了做到这一点,我有这样一段代码:
String spoolDir = "C\\Windows\\System32\\spool\\PRINTERS";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(spoolDir);
int spoolCount = dir.GetFiles().Length;
if (spoolCount > 0)
{
using (PrintServer ps = new PrintServer())
{
System.Drawing.Printing.PrinterSettings settings = new System.Drawing.Printing.PrinterSettings();
using (PrintQueue pq = new PrintQueue(ps, settings.PrinterName, PrintSystemDesiredAccess.AdministratePrinter))
{
pq.Purge();
}
}
}
我已添加到程序集文件中:
[assembly: SecurityRules(SecurityRulesSet.Level1)]
[assembly: AllowPartiallyTrustedCallers]
[assembly: SecurityTransparent()]
不幸的是我收到了这个错误:
尝试安全透明方法 'MS.Internal.PrintWin32Thunk.PrinterDefaults.Dispose(Boolean)'to 访问安全关键方法 'MS.Internal.PrintWin32Thunk.PrinterDefaults.InternalDispose(布尔值)' 失败。
该应用程序在我正在开发程序的PC(Win 7,64 bit)上完美运行,但在目标PC(Win XP,32位)上运行时,如上所述抛出异常。
应用程序使用4.0框架。我知道这个问题的一个解决方法是将框架降级到3.5,但不幸的是我正在使用一个需要4.0框架的库。
当我将PrintQueue构造函数更改为:
时PrintQueue pq = new PrintQueue(ps, settings.PrinterName)
然后我在Win XP中获得访问被拒绝的异常。
我该怎么做才能解决问题?
提前感谢您的帮助:)