Excel アドインのアクセス違反
質問
C#、VS2005、および .NET 2.0 を使用します。(XP 32 ビット) これは、Interop ライブラリを介して VBA アドイン (.xla) によって呼び出される Winforms アプリです。このアプリはしばらく前から存在しており、アセンブリがコンパイルされ、開発マシン以外の場所で実行されても問題なく動作します。開発環境では、「0x でハンドルされない例外が発生しました...」というメッセージが表示されて激しくクラッシュします (デバッガー内でオブジェクトを実行しているだけです)。EXCEL.EXE 内:0x...読み取り位置違反 0x...
しかし、ここに奇妙な部分があります:
私のインターフェースの最初のメソッドは正常に動作します。他のすべてのメソッドは上記と同様にクラッシュします。コードの近似は次のとおりです。
[Guid("123Fooetc...")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IBar
{
[DispId(1)]
void ThisOneWorksFine(Excel.Workbook ActiveWorkBook);
[DispId(2)]
string Crash1(Excel.Workbook ActiveWorkBook);
[DispId(3)]
int Crash2(Excel.Workbook activeWorkBook, Excel.Range target, string someStr);
}
[Guid("345Fooetc..")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyNameSpace.MyClass")]
public class MyClass : IBar
{
public void ThisOneWorksFine(Excel.Workbook ActiveWorkBook)
{...}
string Crash1(Excel.Workbook ActiveWorkBook);
{...}
int Crash2(Excel.Workbook activeWorkBook, Excel.Range target, string someStr);
{...}
}
ある種の環境問題のような気がします。レジストリがチャンダ化されていますか?コードのバグの可能性がありますが、他の場所では正常に動作します。
解決
以前、Office 2003 でこのシナリオで問題が発生しました。役に立ったもの:
Office 2003 Service Pack 2 をインストールすると、Excel を閉じるときに発生するいくつかのクラッシュが発生しなくなります。
Office 2003 Service Pack 3 をインストールすると、VSTO2005 アプリケーションで XP スタイルを使用する際のバグが修正されます (今回のケースではありません)。
Excel VBA CodeCleaner の実行 http://www.appspro.com/Utilities/CodeCleaner.htm 定期的にランダムなクラッシュを防ぐのに役立ちます。
複数のスレッドから Excel オブジェクトにアクセスするのは危険なので、そのようなことはしないでください。
可能性がある場合は、Microsoft PSS でケースを開いてみることもできます。問題を再現できれば、かなり効果的です。そして、ほとんどの場合、この種のことはバグなので、料金は請求されません :)
他のヒント
開発マシンは Win64 ですか?アプリの win64 ビルドで問題が発生しましたが、ビルド プラットフォームを x86 に設定すると問題が解決します。
開発マシンは他のマシンとは異なるバージョンの Office を実行していますか?PIA が異なることは知っています。したがって、たとえば Office 2003 で開発し、Office 2007 でテストしている場合 (またはその逆)、問題が発生します。