PnP3dObjectsMgd not found exception

<?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 (….)’.

PnP3dObjectsMgd_not_found

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>

Comments

2 responses to “PnP3dObjectsMgd not found exception”

  1. Hi Augusto! Due to TypePad Editor bug your code is not readable. Please, repost it.
    Best Regards!

  2. Fixed, thanks Alexander!

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading