How to debug PDSOE Could not find class or interface . (1288

Posted by cverbiest on 07-Dec-2016 10:02

I have a OE.Net class that uses a user control build around a telerik control.

One some machines the source compiles, on others it doesn't.

All machines use a local copy of the same assemblies directory,

All machines use oe11.6.2

code :

define variable telerikXHtmlEditorControl1 as class TelerikMarkupEditorLibrary.TelerikXHtmlEditorControl no-undo.

shows following error

- Could not find class or interface TelerikMarkupEditorLibrary.TelerikXHtmlEditorControl. (12886)

The referenced assemblies look ok

The class browser looks ok

Posted by cverbiest on 08-Dec-2016 11:47

A full compile fixed the runtime issue,

Now I get a Telerik Nag screen prompting me to "Purchase now" at run-time. No option to enter my existing license info :-( but that will be another issue.

Thank you for your assistance,

from what I can tell the solution came with the service pack installation.

All Replies

Posted by Laura Stern on 07-Dec-2016 10:42

Does the assemblies directory just contain assemblies.xml or are the Telerik dlls there as well?  If not, where are they?

Posted by cverbiest on 08-Dec-2016 08:34

There is an assemblies.config file containing

<configuration>
 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" >
    <probing privatePath="CCE;Consultingwerk;Infragistics;Microsoft;Apache;Support;Telerik;C1;ZeroMQ;graphviz;Net" />
  </assemblyBinding>
 </runtime>
</configuration>

All Telerik components are in the Assemblies subdirectory. On my laptop thy are also installed locally

Our component is in the CCE subdirectory.

Posted by Laura Stern on 08-Dec-2016 09:00

What do you mean "installed locally"?  So does that mean the assemblies are in the GAC?   i.e., You can just have the assembly dlls sitting there in the directory, or they can be installed in the Global Assembly Cache.  Is your laptop where it works or where it doesn't work?  Is it "installed locally" on the machines where it does not work?  

I don't know anything about an assemblies.config file!  There is a .config file for the executable (e.g., prowin32.exe.config) which serves this purpose.  Do you have the name right?

Posted by Garry Hall on 08-Dec-2016 09:43

To address Laura's last question: yes, assemblies.config is correct, it is the app config file in the assemblies directory that configures the CLR when loading assemblies from the assemblies directory.

However, the answers to Laura's other questions will possibly hold the key to figuring this out.

In the past, I have used Fusion Log Viewer (fuslogvw) to watch the binding, which can identify the cause of the binding failure. It might have improved since I played with it many years ago, but at the time it was not very friendly, although I persisted with it to figure things out. There might even be better tools available now.

Posted by cverbiest on 08-Dec-2016 09:44

My previous post should have read : All Telerik components are in the Telerik  subdirectory of the assemblies directory.

> What do you mean "installed locally"?

Using the Telerik Control Panel application . I don't think it copies to the GAC, only to c:\programm files\telerik\

It doesn't work on my laptop, the setup on the laptop where it does work is similar.

> I don't know anything about an assemblies.config file!  There is a .config file for the executable (e.g.,

> prowin32.exe.config) which serves this purpose.  Do you have the name right?

assemblies.config allows you to put the dll's into subdirectories instead of one huge directory, it's a trick I learned from Mike Fechner, it is mentioned on documentation.progress.com/.../index.html , The probing tag is explained on msdn.microsoft.com/.../823z9h8w(v=vs.110).aspx

I don't think the assemblies.config causes the issue but I'll test without.

Posted by cverbiest on 08-Dec-2016 09:55

I'll try fuslogvw to see if it shows extra info.

Is there a way to query a run ABL.Net session to see which assemblies got loaded ?

Posted by Garry Hall on 08-Dec-2016 10:03

There is no way directly with ABL to see what assemblies have been loaded by .NET. If there is .NET functionality available to list what assemblies have been loaded for the current AppDomain, you could always try calling that from ABL. I don't know if there is such a thing in .NET, just hypothesizing.

Having the AVM generate a list of the things it asks .NET to load would be an enhancement request. It would be an incomplete list, as the CLR will load dependencies based on its own rules, and the AVM would not know about them. Something that gives insight into the CLR would be much more helpful.

Posted by Garry Hall on 08-Dec-2016 10:05

Hmmm... MSDN suggests AppDomain.GetAssemblies(). Does that help?

Posted by Garry Hall on 08-Dec-2016 10:47

Maybe the following snippet might be useful to you. It shows from where an assembly was loaded, GAC vs file system. It will display an error for one of the internal assemblies, you can ignore that.

DEF VAR oAppDomain AS System.AppDomain NO-UNDO.
DEF VAR oAssemblies AS System.Reflection.Assembly EXTENT NO-UNDO.
DEFINE VARIABLE ictr AS INTEGER     NO-UNDO.

oAppDomain = System.AppDomain:CurrentDomain.
oAssemblies = oAppDomain:GetAssemblies().

DO ictr = 1 TO EXTENT(oAssemblies):
    DISPLAY 
    oAssemblies[ictr]:FullName FORMAT "x(128)"
    oAssemblies[ictr]:Location FORMAT "x(70)"
        WITH DOWN FRAME f1 WIDTH 132.
    DOWN WITH FRAME f1.
END.

Posted by cverbiest on 08-Dec-2016 10:58

The compilation error problem is gone after installing service pack oe11.6.3, was oe11.6.2.

I don't think the service pack itself fixed it, because all other machines are still using 11.6.2, but maybe something the installer did.

I'm getting runtime errors now but these could be something else altogether

---------------------------

System.NullReferenceException: Poging om gebruik te maken van een.NET-object dat is vrijgegeven. (15561)

---------------------------

translates to "Attempt to reference a .Net object that has been released".

fuslogvw doesn"t show anything

Posted by cverbiest on 08-Dec-2016 11:22

Thank you for the code sample, I tweaked it a bit,

  • bigger window
  • repeat instead of do, so that it continues after an error
DEF VAR oAppDomain AS System.AppDomain NO-UNDO.
DEF VAR oAssemblies AS System.Reflection.Assembly EXTENT NO-UNDO.
DEFINE VARIABLE ictr AS INTEGER     NO-UNDO.
 
current-window = default-window.
assign
    DEFAULT-WINDOW:ROW = 1
    DEFAULT-WINDOW:COLUMN = 1
    default-window:width-chars = 220
    default-window:height-chars = 28
    default-window:font = 1.

oAppDomain = System.AppDomain:CurrentDomain.
oAssemblies = oAppDomain:GetAssemblies().
 
repeat ictr = 1 TO EXTENT(oAssemblies) with frame f1 width 220:
    display ictr form "zz9" with frame f1 .
    DISPLAY 
        oAssemblies[ictr]:FullName FORMAT "x(128)" 
        oAssemblies[ictr]:Location FORMAT "x(70)"
        WITH DOWN FRAME f1 WIDTH 220.
    DOWN WITH FRAME f1.
END.

Posted by cverbiest on 08-Dec-2016 11:47

A full compile fixed the runtime issue,

Now I get a Telerik Nag screen prompting me to "Purchase now" at run-time. No option to enter my existing license info :-( but that will be another issue.

Thank you for your assistance,

from what I can tell the solution came with the service pack installation.

Posted by cverbiest on 16-Dec-2016 04:10

We had a second instance of the same issue on another computer, installing the service pack fixed it again. I don't know what the installer does to fix the issue but it obviously does something.

This thread is closed