私はC#で作業していたアドオンの中に2つの異なる機能を持っています。最近(明らかに)SolidWorksは、これらの2つの機能の特定の部分に到達するとクラッシュしています(これ以上のことはありませんが、これまでに見つかったのは2つだけです)。デバッグでは、両方の関数が "Memory Access Violationエラー"。このエラーは、毎回アクティブな文書を閉じる行で発生し、時間の約95%が発生します。SolidWorks、Isldworks.CloseDocのメモリアクセス違反エラーを追跡する
ほとんどの場合、同じ部分にあります。 実行時間や開閉された部品の数に依存しないようです。 ファイルを閉じないと、エラーが発生しないようです。しかし、大規模なアセンブリを実行すると、それは独自の問題を提示します。 閉じる前に1秒の待機時間を追加すると、エラーの頻度が減るように見えます(エラーなしでアセンブリ全体を時折取得できます)。
私が主に気にしている機能を簡単に説明しています。 ;これは、アセンブリのトップレベルから、カスタムアセンブリをメインアセンブリおよびサブアセンブリから子に伝播するまで機能します。ですから、私は常に異なるアセンブリとパーツファイルを開いたり閉じたりしています。
以下のコードは、エラーを再現する最小限のものまでほとんど削除されています。エラーは59行目で発生します。これまでオンラインで見たIveから、これは追跡が難しいようです。どんな助けでも大歓迎です。
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;
}
更新:この質問を見た後、 What's causing the memory access violation?私は自分の関数で何の効果もないグローバル変数を使いこなそうとしました。しかし、私は、この問題を回避していると思われる部分をループするために、別の論理構造で自分の本質的なコードをラップすることができました。しかし、私は気分が最高だと感じ、将来この問題を回避できるようにしたいと考えています。
誰も入力したことがありません。 – Nick
あなたはC#でコードを書いています - あなたがPInvokesや安全でないブロックなどで作業している場合を除き、メモリアクセス例外を発生させることは不可能です。合理的な唯一の答えは、SolidWorksには妥当な入力をクラッシュさせる不合理な入力、または不合理な入力を検証していないためクラッシュさせるバグがあることです。あなたはどこにでもnullを渡していますか?オブジェクトを閉じた後にオブジェクトを使用しようとしていますか?非同期の操作を使用していますか?フックを提供していますか? – antiduh
[OpenDoc](http://help.solidworks.com/2012/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISldWorks~OpenDoc.html)は推奨されていないようです。あなたが新しい方法を使用していない理由は何ですか?なぜOpenDocの戻り値を使用しないのですか? – antiduh