Wednesday, April 3, 2019

Debug external assemblies

Recently I have had the need to understand what was going on inside one of the exchange rate import providers and also the security settings import. Both are only delivered as dll's, which you can find in the bin folder.

To see a decompilation of the code in the assembly, there are several different tools you can use to load it. These are the ones I have some experience with:

They all have that in common that you open the tool, select the dll of the assembly and let the tool decompile it. Here is an example of how that could look for the exchange rate provider I was looking into:

You can also use these tools to look into compiled label files. I sometimes use that when I need to find a particular translation. That could look like this (the language is danish if you wonder):

For the security settings import issue I had a need to debug it to figure what was going on, and in the following I'll try to explain how to do that in the most simple terms as possible.

To be able to debug you need to a have some symbol files. The .NET Reflector Visual Studio integration has a tool for generating these from the compiled dll:

In the following dialog you choose the assembly:

When the PDB's are generated, you can see that a new symbol location has been added to the debugger options:

A few other properties in the debugger options needs to set in a particular way:

Now just add a breakpoint to wherever X++ calls out to the assembly, and you are all set.

Here is a screen clip from a session:

The experience it not totally perfect. The watch windows has problems with some variables and objects because of some "optimization" going on. Check the last link in this article, for a suggestion on how to deal with that.

You must be an administrator to install these tools on the developer box. That means the box must be cloud hosted and not Microsoft hosted.

As an MVP I have been offered a free license of .NET Reflector from Redgate. That is why I'm able to use this particular product for the example.

And I got great value from reading these blog posts, to figure how to setup .NET Reflector debugging:
Disabling Optimizations when Debugging .NET Framework Source Code

No comments: