Mam dwie różne funkcje wewnątrz dodatku, nad którym pracowałem w C#. Ostatnio (Wygląda na to, że) Solidworks zawodzi, kiedy dotrze do niektórych części tych dwóch funkcji (prawdopodobnie więcej, ale są to jedyne dwa, na które udało mi się dotąd natrafić). Podczas debugowania obie funkcje dają mi "naruszenie praw dostępu do pamięci". Błąd". Ten błąd występuje za każdym razem, gdy zamykam aktywny dokument i występuje w przybliżeniu w 95% przypadków.Solidworks, śledzenie błędu naruszenia dostępu do pamięci na Isldworks.CloseDoc
To prawie zawsze na tej samej części. Wydaje się być niezależny od czasu wykonywania lub liczby części, które zostały otwarte i zamknięte. Jeśli nie zamykam plików, nie wydaje mi się, aby błąd. Ale podczas pracy z dużym zespołem przedstawia on własne problemy. Dodanie 1-sekundowego czekania przed zamknięciem wydaje się zmniejszać częstotliwość błędu (jak w, mogę sporadycznie przedostać się przez cały zespół bez błędu)
Szybkie wyjaśnienie, na czym polega przede wszystkim funkcja, której się przede wszystkim martwię ; Działa z poziomu najwyższego złożenia, propagując właściwości niestandardowe z głównego zespołu i podzespołów do ich elementów podrzędnych. Dlatego ciągle otwieram i zamykam różne pliki montażowe i częściowe.
Poniższy kod został usunięty do prawie absolutnego minimum, które replikuje błąd. Błąd występuje w linii 59. Z tego, co dotychczas widziałem w sieci, wynika, że trudno je wyśledzić. Każda pomoc jest bardzo doceniana.
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;
}
Aktualizacja: Po obejrzeniu tego pytania; What's causing the memory access violation? Próbowałem mieszać z niektórymi globalnymi zmiennymi, których używam w moich funkcjach, bez efektu. Udało mi się jednak zawrzeć mój zasadniczy kod w innej strukturze logicznej, aby zapętlić części, które zdają się unikać tego problemu. Ale czuję, że jest to w najlepszym przypadku pomoc zespołowa i chciałbym móc uniknąć tego problemu w przyszłości.
Nikt nie ma żadnych danych wejściowych na ten temat? – Nick
Piszemy kod w C# - chyba że pracujesz z PInvokes, niebezpiecznymi blokami lub podobnymi, nie powinno być możliwe wywoływanie wyjątków dostępu do pamięci. Jedyną sensowną odpowiedzią jest to, że SolidWorks ma błąd, który powoduje jego awarię z powodu uzasadnionych danych wejściowych lub powoduje awarię, ponieważ nie zatwierdza nieuzasadnionych danych wejściowych. Czy przekazujesz null nigdzie? Czy próbujesz użyć obiektów po ich zamknięciu? Czy używasz jakichkolwiek operacji, które są asynchroniczne? Czy zapewniasz mu jakieś haki? – antiduh
[OpenDoc] (http://help.solidworks.com/2012/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISldWorks~OpenDoc.html) wydaje się być przestarzałe. Każdy powód, dla którego nie używasz nowszych metod? Dlaczego nie używasz wartości zwracanej z OpenDoc? – antiduh