我在 C# 中使用的插件中有两个不同的功能。最近(显然)Solidworks 在到达这两个函数的某些部分时一直崩溃(可能更多,但这是迄今为止我发现的仅有的两个。)在调试下,这两个函数都给我一个“内存访问冲突”错误”。每次在我关闭活动文档的行上都会发生此错误,并且大约有 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;
}
更新:看到这个问题后;是什么导致内存访问冲突?我尝试弄乱我在函数中使用的一些全局变量,但没有效果。然而,我设法将我的基本代码包装在不同的逻辑结构中,以便循环访问似乎可以避免这个问题的部分。但我觉得那充其量只是一个创可贴,并且希望将来能够避免这个问题。