InvokeButton Not loading all dlls

Hello, fellow pyreviteers!
image
I get this error when running the .invokebutton - saying it can’t locate the Community.Toolkit.Mvvm assembly even though the file does exist in the bin folder
image

I have also seen this error pop up if I use the Ookii.Dialogs.Wpf.dll reference.
I was wondering if anybody had any thoughts or opinions :slight_smile:

Thanks
Aniket

Where are those DLLs?8 And where is the main DLL (the one that holds the logic to your tools)?

I think they need to all be in the bin folder. Although admittedly I don’t remember the difference from the lib folder and the bin folder.

If they already are there, you might have to load them from the startup script. Do you have a startup.cs or startup.py script?
In case, at some point in the Execute method (better towards the top obviously) you just load all the DLLs you need in your tools.

Something like this:

// load dependencies first
// NOTE:
// 1) we are reading the binary contents of the assembly file and loading
// from memory so Revit does not block the actuall dll file
// 2) loading of the dependendencies is required otherwise the script.cs will compile but
// will return error on execution since it can not resolve the reference to a required dll
// 3) The order of loading dependencies is actually important since they themselves have
// internal dependencies to each other e.g. Newtonsoft.Json is used in other dlls
// 4) no checks are done for dll existence so you need to improve this loop
#endregion
foreach (string dependencyAssembly in new string[] {
    "Newtonsoft.Json.dll",
    "Prism.dll",
    "CommunityToolkit.Mvvm.dll",
    <etc>
})
    Assembly.LoadFrom(
        Path.Combine(BinPath, dependencyAssembly));

Use LoadFrom so it surely loads the correct version from the folder (this blocks the dll so it cannot overwrite)

or this:

foreach (string wbAssembly in new string[] {
    "Newtonsoft.Json.dll",
    "Prism.dll",
    "CommunityToolkit.Mvvm.dll",
    <etc>
})
    Assembly.Load(
        File.ReadAllBytes(Path.Combine(BinPath, wbAssembly)));

So they are not blocked and they can be overwritten while Revit is on

Note that you can also use a combination of the two methods, in case some DLLs need to be version specific and not overwritten and if others need to be overwritten and so, cannot be blocked.

Hope this helps :wink:

2 Likes

awesome! thanks @AndreaTas