Thomas
Thomas

Reputation: 992

When loading managed c++ dll using Assembly.LoadFrom() receive file not found exception

I am developing an add-in using VSTO for Microsoft project and I have a managed c++ dll that wraps an un-managed c++ dll. I need to deploy two versions of the managed c++ dll one for 64 bit and one for 32 bit. I am using Assembly.LoadFrom(path) to load the appropriate dll depending on which version of Office I am running from. This all seems to work fine on my development machine which is a 64 bit machine running 64 bit office. Below is the code in question:

        try
        {
           //This will return true so I know the file exists
            bool fileExists = File.Exists(path);
            //This will throw a file not found exception
             keyModAssembly = Assembly.LoadFrom(path);

        }
        catch (FileNotFoundException e)
        {

        }  

I have triple checked the path and the file exists and is the correct 32 bit dll. This all works fine on my 64 bit machine but fails in xpmode when I am trying to test it for 32 bit versions.

any suggestions would be greatly appreciated.

Thanks in advance.

Edit

In response to Phillip's suggestion about the unmanaged dll possibly not being found I am loading the unmanaged dll into scope using the LoadLibraryW(path).

// this is not throwing an exception so I know the unmanaged dll is there. 
if (!File.Exists(unmanagedPath))
            throw new FileNotFoundException();
LoadLibraryW(unmangedlibPath);

Upvotes: 0

Views: 1892

Answers (1)

Philipp Schmid
Philipp Schmid

Reputation: 5828

Could it be that the wrapper assembly (which I assume is what path points to in your example) is loaded correctly, but the native DLL which it references is not found? You are not checking for that one in your code. Often the error message says 'Assembly or one of its dependencies is not found'.

A good way to investigate this is to use either procmon from the SysInternals tools to monitor the file system access (which will tell you where the system is looking for your 32-bit DLL) or use the Fushion facilities in Windows.

Upvotes: 1

Related Questions