gpt4 book ai didi

c# - Solidworks,追踪 Isldworks.CloseDoc 上的内存访问冲突错误

转载 作者:太空狗 更新时间:2023-10-29 17:55:57 27 4
gpt4 key购买 nike

我一直在使用 C# 开发的插件中有两个不同的函数。最近(显然)Solidworks 在执行这两个函数的某些部分时崩溃了(可能更多,但这是迄今为止我发现它发生的仅有的两个。)在调试下,这两个函数都给我一个“内存访问冲突”错误”。每次在我关闭事件文档的行上都会发生此错误,并且大约有 95% 的时间会发生。

它几乎总是在同一部分。它似乎与运行时间或已打开和关闭的部件数无关。如果我不关闭文件,我似乎不会收到错误消息。但是在运行大型程序集时,这会带来自己的问题。在关闭前添加 1s 等待似乎可以减少错误的频率(例如,我偶尔可以在没有错误的情况下完成整个程序集)

快速解释我主要关注的功能是做什么的;它从装配体的顶层向下工作,将自定义属性从主装配体和子装配体传播到它们的子装配体中。所以我经常打开和关闭不同的装配体和零件文件。

下面的代码已被精简到几乎可以复制错误的最低限度。错误发生在第 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;
}

更新:看到这个问题后; What's causing the memory access violation?我尝试弄乱我在函数中使用的一些全局变量,但没有效果。然而,我设法将我的基本代码包装在一个不同的逻辑结构中,以循环遍历似乎避免了这个问题的部分。但我觉得那充其量只是一个创可贴,希望将来能够避免这个问题。

最佳答案

您正在用 C# 编写代码 - 除非您正在使用 PInvoke、不安全的 block 或类似的东西,否则您应该不可能导致内存访问异常。那么唯一合理的答案是 SolidWorks 有一个错误,该错误要么导致它在给定合理输入的情况下崩溃,要么导致它崩溃,因为它没有验证不合理的输入。

真正的解决办法是联系 SolidWorks 让他们重现并修复该错误;否则,我们可以分析您的代码以寻找作为错误和故障的常见触发器的交互。例如,他们可能没有正确验证他们所有的输入——你可能提供了他们默默接受的无效值;它直到很久以后才中断。

如果您不小心传递了 null 而他们没有检查,如果他们稍后尝试从该 null 获取指针,则可能会导致内存访问冲突。如果您在资源关闭后使用它们,并且它们没有验证这种情况,它们可能会在幕后使用陈旧的指针,这也会导致内存访问冲突。

在其他情况下,异步操作可能会导致错误 - 如果您开始一些异步操作然后关闭与该操作相关的资源,当该操作稍后在后台进行时,它可能会导致错误。

您使用返回给您的句柄的方式可能会导致内存访问冲突。我注意到您没有使用 OpenDoc 的返回值,而是尝试通过其他方式访问文档。当 OpenDoc 的返回值被垃圾回收时会发生什么?也许 SolidWorks 没有正确地引用计数,因此当返回值被 GC 处理时,引擎盖下的句柄被关闭并为空;然而其他操作仍然期望它是有效的,从而导致内存访问冲突。

也有可能您正在使用已弃用的 API - 如果是这样,您可能正在 SolidWorks 中执行代码,这些代码更有可能出现错误,因为它不再被测试或维护。我注意到您正在调用 OpenDoc方法,他们的文档将其列为已弃用。考虑改用推荐的方法,例如 OpenDoc6 .

除了解决 API 损坏或未充分验证损坏输入的真正问题之外,您唯一的选择是调查这些常见 API 问题的来源。

关于c# - Solidworks,追踪 Isldworks.CloseDoc 上的内存访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37545905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com