如何让C++ EXE加载不同目录下的C# DLL?
解决C++ EXE加载不同目录下C# DLL的配置方法
我来帮你把具体步骤理清楚,其实利用CLR的配置文件就能轻松实现这个需求,不用改太多代码,主要是配置文件的写法:
1. 创建应用程序配置文件
首先,在你的C++ EXE所在目录下,创建一个和EXE同名的.config文件。比如你的EXE叫MyCppApp.exe,那配置文件名就是MyCppApp.exe.config,这个文件必须和EXE放在同一个目录里。
2. 编写配置文件内容
打开这个配置文件,写入以下XML结构,核心是通过<probing>节点指定C# DLL所在的相对路径:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 这里填写你的C# DLL所在的相对目录,多个目录用分号分隔 --> <probing privatePath="CSharpDlls;../ThirdParty/Libs" /> </assemblyBinding> </runtime> </configuration>
配置说明:
privatePath:填写相对于EXE目录的路径,比如CSharpDlls就是EXE同目录下的CSharpDlls文件夹;../ThirdParty/Libs是EXE目录的上级目录下的ThirdParty/Libs文件夹。如果有多个目录,用分号;分隔就行。- CLR在加载C# DLL时,会先搜索EXE目录,然后去
privatePath指定的目录里找,完全符合你的需求。
3. (可选)用绝对路径指定DLL位置
如果你的C# DLL放在固定的绝对路径下,也可以用<codeBase>节点来精确指定,但这个方法需要你的C# DLL是强签名的(有publicKeyToken和版本号),配置示例如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <!-- 替换成你的C# DLL的标识信息 --> <assemblyIdentity name="YourCSharpLibrary" publicKeyToken="1234567890abcdef" culture="neutral" /> <!-- 替换成你的DLL的绝对路径和版本号 --> <codeBase version="1.0.0.0" href="D:\MyDlls\YourCSharpLibrary.dll" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意事项:
- 用
<codeBase>时,必须准确填写C# DLL的name、publicKeyToken、version,这些信息可以通过VS的命令行工具sn.exe或者查看DLL属性获取。 - 相对路径的
<probing>方法更灵活,推荐优先使用,除非你需要固定绝对路径。
4. 验证配置
把你的C# DLL(包括它的依赖DLL)放到你指定的目录里,然后运行C++ EXE,CLR会自动按照配置文件的路径去搜索加载C# DLL,不用修改原来的CLR包装类代码。
内容的提问来源于stack exchange,提问作者N.avraham
相关产品推荐
相关产品推荐

