[mapguide-users] What is left before MGOS 4.0 RC1

Crispin Hoult (TrueViewVisuals) crispin at trueviewvisuals.com
Thu Aug 14 02:45:36 PDT 2025


ILSpy is ideal for actually checking DLL not found (or version mismatch with e.g. System.Memory but you probably did this

But Bitness is the likely culprit... I spent days troubleshooting one application that had some x64 and some AnyCPU that didn't play nice together


 best regards,
  Crispin

Founder / CEO :: Linknode Ltd, trading as TrueViewVisuals

________________________________
From: mapguide-users <mapguide-users-bounces at lists.osgeo.org> on behalf of Pierre Cardinal via mapguide-users <mapguide-users at lists.osgeo.org>
Sent: Wednesday, August 13, 2025 7:26:33 PM
To: MapGuide Users Mail List <mapguide-users at lists.osgeo.org>
Cc: Pierre Cardinal <pierre.cardinal at sympatico.ca>; Jackie Ng <jumpinjackie at gmail.com>
Subject: Re: [mapguide-users] What is left before MGOS 4.0 RC1

Hi Jackie,

Perhaps there is some solutions for you from this Gemini answer.


Based on your description, this is a classic and very frustrating problem in modern .NET when dealing with native libraries (DLLs). The good news is that there are well-established debugging strategies for this scenario. The developer is right—fuslogvw.exe is no longer the tool for the job.
Here is a proposed solution path, broken down into key steps:
1. The Core Problem: The DLL has Missing Dependencies
The most likely cause of a DllNotFoundException when the DLL file is present is that one of its own native dependencies is missing. The .NET runtime tries to load your DLL, but the operating system's loader (not the .NET runtime itself) fails because a required dependency is not found. The resulting exception message from .NET points to your DLL, but the root cause is elsewhere. This is the "cryptic" part.
For MapGuide Portable, this is a very common issue because it relies on a whole chain of native C++ libraries for things like FDO, GDAL, and various other components.
2. Modern Debugging Tools and Techniques
The developer correctly observed that Process Monitor shows the file is present. The next step is to use tools that can inspect the dependencies of a native DLL.
a) Use a Dependency Inspection Tool
This is the most critical step. Forget fuslogvw.exe and Process Monitor for a moment and focus on the DLL itself.
 * "Dependencies" Tool: This is the modern successor to the old Dependency Walker. It's a free, open-source tool available on GitHub. It's specifically designed to analyze the dependencies of native DLLs, including identifying architecture mismatches (32-bit vs. 64-bit) and showing which DLLs in the dependency tree are missing. Run this tool on the core MapGuide DLL that your .NET code is trying to load. It will likely show a list of other DLLs, some of which may be marked as not found.
b) Inspect the Process with a Debugger
While not as direct as a dependency tool, a debugger can also provide clues.
 * Visual Studio Modules Window: While debugging your .NET application in Visual Studio, open the Modules window (Debug > Windows > Modules). This window lists all the DLLs that have been loaded by your application. When the DllNotFoundException occurs, you can check which native DLLs were loaded successfully and which were not. The last native DLL that failed to load (just before the exception) is your primary suspect.
3. Solution and Mitigation Strategies
Once you have identified the missing dependency, you can take action.
a) Resolve Missing Dependencies
 * Find and Copy the Missing DLLs: The most straightforward solution is to find the missing native DLLs (e.g., from the MapGuide installation folder or a separate dependency package like GDAL) and copy them into the same directory as your application's executable. This ensures the operating system's loader can find them.
 * Install the Correct Visual C++ Redistributable: Many C++-based libraries like MapGuide depend on the Microsoft Visual C++ Redistributable packages. If the correct version (e.g., 2015-2022) is not installed on the target machine, core C++ runtime DLLs will be missing, leading to the cryptic DllNotFoundException.
 * Check the "Bitness": Make sure there is no mismatch. If your .NET application is compiled for x64, all native DLLs must also be x64. An x86 DLL will fail to load in an x64 process, and vice-versa.
b) Address Path-Related Issues
The user mentioned that the files are "there," but the runtime doesn't "want to look in the folders." This is a key insight. Modern .NET doesn't automatically add subdirectories to the native library search path.
 * Explicitly Set the Search Path: You can programmatically set the search path for native libraries using the NativeLibrary.SetDllImportResolver method in .NET 5+ or by adding the native libraries' folder to the PATH environment variable of the process before loading them.
 * Post-Build Events: A robust solution for a project is to use a post-build event in your .csproj file to automatically copy all necessary native DLLs and their dependencies into the build output directory (e.g., bin\Debug). This ensures that the DLLs are always in the correct location for the application to run.
Summary of the Recommended Solution Path
 * Stop using Process Monitor to look for the file directly. Instead, use a tool that inspects the dependencies of that file. The "Dependencies" tool is the best choice here.
 * Run "Dependencies" on the main MapGuide DLL that your .NET code is trying to load.
 * Identify the exact native DLL(s) that are reported as missing.
 * Find the missing DLLs (often in the main MapGuide installation or in a separate dependency folder) and copy them into your application's output directory.
 * Confirm the "bitness" (x86 vs. x64) of your application and all native DLLs is consistent.
 * Ensure the correct Visual C++ Redistributable is installed.
 * If the problem persists, consider a programmatic approach to set the native DLL search path or use post-build events to ensure all dependencies are copied to the correct location.


Régards

Pierre
________________________________
De : mapguide-users <mapguide-users-bounces at lists.osgeo.org> de la part de Jackie Ng via mapguide-users <mapguide-users at lists.osgeo.org>
Envoyé : mercredi, août 13, 2025 7:57:13 a.m.
À : MapGuide Users Mail List <mapguide-users at lists.osgeo.org>
Cc : Jackie Ng <jumpinjackie at gmail.com>
Objet : [mapguide-users] What is left before MGOS 4.0 RC1

Hi All,

Just to provide some transparency on what is left before RC1 releases.

I am currently working on getting MapGuide Portable (formerly known as mg-desktop) bindings working under our new way of generating language bindings. I am having some difficulty getting the new package to work due to cryptic missing dll errors that are cryptic because:

 a) I have no idea how to even debug a DllNotFoundException in this new .net world. In the past when everything was still legacy .net Framework 4.x we could run fuslogvw.exe and turn on assembly binding errors and that would tell us straight away what the missing dlls are. In this new .net world, fuslogvw.exe doesn't seem to work anymore and I don't know what the new "modern .net" way to diagnose assembly binding failures is. Thanks to Microsoft's excellent track record in naming their products and technologies, any attempts to search for this topic naturally returns decade-old articles and blog posts that are no longer relevant to modern .net!

 b) The dll files .net is complaining about not being able to find *are there*, some part of the .net runtime just doesn't want to look in the folders I've placed these dll files in (as evidenced by monitoring the consuming application under Process Monitor)

This is not a crucial component of MapGuide (merely a supplemental part), so I am giving myself the rest of the week to try to solve this problem. If I can't come up with a solution, I'll park this sub-project until after the 4.0 release.

I am also working on finishing up the new API documentation experience where instead of our current approach of documenting a C++ API and sprinkling .net/Java/PHP sample fragments in various class/method comments in the hopes you'll understand how to use such a C++ class or method in a .net/Java/PHP context, we try to provide the MapGuide API docs for every target language in that language's natively preferred API documentation tool of choice.

 - For .net, this is docfx (https://dotnet.github.io/docfx/)
 - For Java, this is the built-in javadoc
 - For PHP, unfortunately we'll have to put a landing page that tells you how to re-interpret the .net or Java API docs in a PHP context. PHP unfortunately does not support overloaded methods and our PHP binding just smushes all of these overloads into a single method whose parameters vary based on the overload set of parameters you're trying to use. This makes it really hard to translate C++ API documentation across, unlike .net or Java where everything translates 1:1. Until we can find a solution to this problem, our C++ API docs are not translatable for PHP API documentation generation.

I'll also be doing yet another sweep of our web tier components and will be bundling updated versions of Apache, PHP and Tomcat where required.

On the FDO front, the PostgreSQL materialized view fix is in. Nothing else of a show-stopping nature seems to be blocking us there, so that's all ready to go. I will formally open a FDO 4.2 svn branch before or after this RC1 release (haven't decided yet)

- Jackie

--
http://themapguyde.blogspot.com


Tel: +44 141 374 2741<tel:+441413742741>
Web: TrueViewVisuals.com<https://trueviewvisuals.com/> and RoadsOnline.co.uk<https://www.roadsonline.co.uk/>

[TVV and LCRIG - RoadsOnline]
This message contains confidential information and is intended only for the individual named. If you are not the named addressee you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately by e-mail if you have received this e-mail by mistake and delete this e-mail from your system. E-mail transmission cannot be guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. The sender therefore does not accept liability for any errors or omissions in the contents of this message, which arise as a result of e-mail transmission.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/mapguide-users/attachments/20250814/7e92264e/attachment.htm>


More information about the mapguide-users mailing list