diff options
| -rw-r--r-- | modules/mono/mono_gd/gd_mono.cpp | 36 | ||||
| -rw-r--r-- | modules/mono/mono_gd/gd_mono.h | 2 | 
2 files changed, 38 insertions, 0 deletions
diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index 16ab5f05f6..5ad383e99d 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -139,6 +139,40 @@ void gdmono_debug_init() {  } // namespace +void GDMono::add_mono_shared_libs_dir_to_path() { +	// By default Mono seems to search shared libraries in the following directories: +	// Current working directory, @executable_path@ and PATH +	// The parent directory of the image file (assembly where the dllimport method is declared) +	// @executable_path@/../lib +	// @executable_path@/../Libraries (__MACH__ only) + +	// This does not work when embedding Mono unless we use the same directory structure. +	// To fix this we append the directory containing our shared libraries to PATH. + +#if defined(WINDOWS_ENABLED) || defined(UNIX_ENABLED) +	String path_var("PATH"); +	String path_value = OS::get_singleton()->get_environment(path_var); + +#ifdef WINDOWS_ENABLED +	path_value += ';'; + +	String bundled_bin_dir = GodotSharpDirs::get_data_mono_bin_dir(); +	path_value += DirAccess::exists(bundled_bin_dir) ? bundled_bin_dir : mono_reg_info.bin_dir; +#else +	path_value += ':'; + +	String bundled_lib_dir = GodotSharpDirs::get_data_mono_lib_dir(); +	if (DirAccess::exists(bundled_lib_dir)) { +		path_value += bundled_lib_dir; +	} else { +		// TODO: Do we need to add the lib dir when using the system installed Mono on Unix platforms? +	} +#endif + +	OS::get_singleton()->set_environment(path_var, path_value); +#endif +} +  void GDMono::initialize() {  	ERR_FAIL_NULL(Engine::get_singleton()); @@ -207,6 +241,8 @@ void GDMono::initialize() {  	mono_set_dirs(assembly_rootdir.length() ? assembly_rootdir.utf8().get_data() : NULL,  			config_dir.length() ? config_dir.utf8().get_data() : NULL); +	add_mono_shared_libs_dir_to_path(); +  	GDMonoAssembly::initialize();  #ifdef DEBUG_ENABLED diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index 06904cfb34..785b65ce13 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -146,6 +146,8 @@ class GDMono {  	MonoRegInfo mono_reg_info;  #endif +	void add_mono_shared_libs_dir_to_path(); +  protected:  	static GDMono *singleton;  |