首先官方有对这个错误给出解释和解决方案,连接如下:
简单来说,貌似是线程问题,我猜。。。
之前我尝试着在代码中添加
Thread.Sleep(1000);
来进行解决,这种办法虽然很蠢,但是有点效果,但是十分不稳定,对于需要休眠的时间很难把握,而且影响程序执行效率。
后来我发现,程序虽然出现呼叫被拒绝的异常,但是加假如对出错的代码,加上try catch,对异常进行捕捉,程序是能够顺利执行的(前提是操作Excel的代码如果比较多的话,不能一起try catch,要分开来try catch,因为如果说在前面捕捉到异常,后面的代码是不执行的),对每一步代码加上try catch,像这样:
try
{
//code1
}
catch (Exception)
{}
try
{
//code2
}
catch (Exception)
{}
try
{
//code3
}
catch (Exception)
{}
try
{
//code4
}
catch (Exception)
{}
嗯。。没错,这种方法是完全没有问题的,程序完全可以执行,并且得到正确结果(捕捉到的异常不用处理,忽略即可)。
但是这个方法同样十分愚蠢。。。
简单看了一下官方给出的解决方案,看不懂,但是看不懂没关系。。会用就行了(官方的解决方案链接在文章开头)
简单来说,就是自己新写一个MessageFilter类,把异常消息单独过滤出来进行处理,然后像这样就行了:
// Register the IOleMessageFilter to handle any threading
MessageFilter.Register();
// ==Insert your code here.==
// and turn off the IOleMessageFilter.
MessageFilter.Revoke();
官方给出的Main方法里的代码很多,但是简单的框架就如同上面所示。这样是最正确的解决方案,并且执行效率高,也不需要try catch去捕获异常。
(PS:我看到有人说,是因为我们用的MS Excel或者是MS Word没有激活才报错的?成功激活了之后也不会报这个错误?这个还不清楚,有待测试)