C# で作業しているアドオン内に 2 つの異なる関数があります。最近 (どうやら) Solidworks は、これら 2 つの関数の特定の部分に到達するとクラッシュするようになりました (それ以上の可能性もありますが、これまでに発生したのはこれら 2 つだけです)。デバッグ中、両方の関数で「メモリ アクセス違反」が発生します。エラー"。このエラーは、アクティブなドキュメントを閉じている行で毎回発生し、約 95% の確率で発生します。
ほとんどの場合、同じ部分にあります。実行時間や、開閉されたパーツの数とは無関係のようです。ファイルを閉じないと、エラーが発生しないようです。しかし、大規模なアセンブリを実行すると、それ自体の問題が生じます。閉じる前に 1 秒の待機を追加すると、エラーの頻度が減少するようです (同様に、エラーなしでアセンブリ全体を通過できる場合もあります)。
私が主に関心を持っている機能が何をしているのかを簡単に説明します。アセンブリのトップ レベルから機能し、カスタム プロパティをメイン アセンブリとサブアセンブリからそれらの子に伝達します。そのため、さまざまなアセンブリ ファイルやパーツ ファイルを頻繁に開いたり閉じたりしています。
以下のコードは、エラーを再現する最小限のコードにまで簡略化されています。エラーは 59 行目で発生します。これまでにオンラインで見たものから、これらを突き止めるのは難しいようです。どんな助けでも大歓迎です。
public void propagateProps(bool overwrite)
{
List<string> assemblies = new List<string>();
string topAssem;
string compName = "";
int i = 0;
int j = 0;
int errors = 0, warnings = 0;
int partType = 1;
swModel = iSwApp.ActiveDoc;
if (swModel == null)
{
MessageBox.Show("No assembly document open. Please open an assembly and try again.", "Avengers Assemble Error");
return;
}
if (swModel.GetType() != 2)
{
MessageBox.Show("No assembly document open. Please open an assembly and try again.", "Avengers Assemble Error.");
return;
}
topAssem = swModel.GetPathName();
assemblies.Add(swModel.GetPathName());
swAssy = iSwApp.ActiveDoc;
while (i < assemblies.Count)
{
List<string> beenDone = new List<string>();
iSwApp.OpenDoc(assemblies[i], 2);
swModel = iSwApp.ActivateDoc(assemblies[i]);
swAssy = iSwApp.ActiveDoc;
foreach (Component2 swComp in swAssy.GetComponents(true))
{
partType = 1;
compName = swComp.GetPathName();
if (compName.IndexOf(").SLD") > 0 || compName.IndexOf("REF") > 0)
{
continue;
}
if (Path.GetExtension(compName).ToUpper() == ".SLDASM")
{
partType = 2;
assemblies.Add(compName);
}
iSwApp.OpenDoc(compName, partType);
swModel = iSwApp.ActivateDoc(compName);
if (swModel == null)
{
continue;
}
#region things that might not be in
#endregion
boolstatus = swModel.Save3(5, errors, warnings);
System.Threading.Thread.Sleep(500);
iSwApp.CloseDoc(swModel.GetPathName());
swPart = null;
swModel = null;
}
++i;
System.Threading.Thread.Sleep(500);
}
return;
}
更新:この質問を見た後。メモリ アクセス違反の原因は何ですか? 関数で使用するいくつかのグローバル変数をいじってみましたが、効果がありませんでした。ただし、この問題を回避していると思われる部分をループするために、重要なコードを別の論理構造にラップすることができました。しかし、それはせいぜいバンドエイドだと感じており、将来この問題を回避できるようにしたいと考えています.