<?xml encoding=”UTF-8″>By Augusto Goncalves
If you are developing to AutoCAD Plant 3D 2014 you may have faced the issue below: ‘Could not load file or assembly PnP3dObjectsMgd (….)’.
A little background information: starting on 2014 release, some vertical products, like Plant 3D, are launched in plain AutoCAD with a startup modifier. This is know as configurable AutoCAD, see more details at this blog post. That way, the AutoCAD folder will have a subfolder /PLNT3D/ with the Plant 3D specific DLL.
But there is a know issue where AutoCAD Plant 3D may not load some required DLLs when a plugin needs it, causing the error message mentioned.
A small trick to solve this exception is ‘help’ Plant 3D find the required DLLs. To do so, create a modify your custom class that implements IExtensionApplication. Inside the Initialize method, include:
<font face="Consolas"><span><font color="#0000ff"><font>void</font></font></span><font><font color="#000000"> </font><span><font color="#2b91af">IExtensionApplication</font></span></font></font><font face="Consolas"><font><font color="#000000">.Initialize()<br>{<br> </font><span><font color="#2b91af">AppDomain</font></span><font color="#000000">.CurrentDomain.AssemblyResolve <br> += CurrentDomain_AssemblyResolve;<br>}</font></font></font>
Now we can customize how and where the .NET engine will search for assemblies it could not find. We just want to include the /PLNT3D/. That can be done in several ways, here is a example:
<span><font color="#2b91af" face="Consolas"><font>Assembly</font></font></span><font><font face="Consolas"><font color="#000000"> CurrentDomain_AssemblyResolve(<br> </font><span><font color="#0000ff">object</font></span><font color="#000000"> sender, </font><span><font color="#2b91af">ResolveEventArgs</font></span></font><font face="Consolas"><font color="#000000"> args)<br>{<br> </font><span><font color="#0000ff">return</font></span></font><font face="Consolas"><font color="#000000"> TryResolvePlant3D(args);<br>}<br> </font><br><span><font color="#0000ff">private</font></span><font color="#000000"> </font><span><font color="#2b91af">Assembly</font></span></font><font face="Consolas"><font color="#000000"> TryResolvePlant3D(<br> </font><span><font color="#2b91af">ResolveEventArgs</font></span></font><font face="Consolas"><font color="#000000"> args)<br>{<br> </font><span><font color="#0000ff">string</font></span></font><font face="Consolas"><font color="#000000"> name = GetAssemblyName(args);<br> </font><span><font color="#0000ff">string</font></span><font color="#000000"> assemblyPath = System.IO.</font><span><font color="#2b91af">Path</font></span></font><font face="Consolas"><font color="#000000">.<br> Combine(PLNT3DFolder, name + </font><span><font color="#a31515">".dll"</font></span></font><font face="Consolas"><font color="#000000">);<br> </font><span><font color="#0000ff">if</font></span><font color="#000000"> (System.IO.</font><span><font color="#2b91af">File</font></span></font><font face="Consolas"><font color="#000000">.Exists(assemblyPath))<br> {<br> </font><span><font color="#2b91af">Assembly</font></span></font><font face="Consolas"><font color="#000000"> assembly = <br> </font><span><font color="#2b91af">Assembly</font></span></font><font face="Consolas"><font color="#000000">.LoadFrom(assemblyPath);<br> </font><span><font color="#0000ff">if</font></span></font><font face="Consolas"><font color="#000000"> (assembly.FullName == args.Name)<br> </font><span><font color="#0000ff">return</font></span></font><font face="Consolas"><font color="#000000"> assembly;<br> }<br> </font><span><font color="#0000ff">return</font></span><font color="#000000"> </font><span><font color="#0000ff">null</font></span></font><font face="Consolas"><font color="#000000">;<br>}<br> </font><br><span><font color="#008000">// based on <a href="http://stackoverflow.com/questions/2729446/resolving-assemblies-the-fuzzy-way" target="_blank">this post</a></font></span><br><span><font color="#0000ff">private</font></span><font color="#000000"> </font><span><font color="#0000ff">string</font></span><font color="#000000"> GetAssemblyName(</font><span><font color="#2b91af">ResolveEventArgs</font></span></font><font face="Consolas"><font color="#000000"> args)<br>{<br> </font><span><font color="#2b91af">String</font></span></font><font face="Consolas"><font color="#000000"> name;<br> </font><span><font color="#0000ff">if</font></span><font color="#000000"> (args.Name.IndexOf(</font><span><font color="#a31515">","</font></span></font><font face="Consolas"><font color="#000000">) > -1)<br> name = args.Name.Substring(0, args.Name.IndexOf(</font><span><font color="#a31515">","</font></span></font><font face="Consolas"><font color="#000000">));<br> </font><span><font color="#0000ff">else</font></span><br></font><font face="Consolas"><font color="#000000"> name = args.Name;<br> </font><span><font color="#0000ff">return</font></span></font><font face="Consolas"><font color="#000000"> name;<br>}<br> </font><br><span><font color="#0000ff">private</font></span><font color="#000000"> </font><span><font color="#0000ff">string</font></span></font><font face="Consolas"><font color="#000000"> PLNT3DFolder<br>{<br> </font><span><font color="#0000ff">get</font></span><br></font><font face="Consolas"><font color="#000000"> {<br> </font><span><font color="#0000ff">return</font></span><font color="#000000"> System.IO.</font><span><font color="#2b91af">Path</font></span></font><font face="Consolas"><font color="#000000">.Combine(<br> </font><span><font color="#2b91af">AppDomain</font></span></font></font><font face="Consolas"><font><font color="#000000">.CurrentDomain.BaseDirectory,<br> </font><span><font color="#a31515">"PLNT3D"</font></span><font color="#000000">);<br> }<br>}</font></font></font>


Leave a Reply