非托管C++通过COM互调C# DLL调用SharePoint CSOM返回ERROR_FILE_NOT_FOUND
这个问题的核心是非托管C++进程无法自动定位SharePoint CSOM的依赖库,而C#测试程序依托NuGet的依赖管理机制能正确加载这些组件。以下是针对性的解决步骤:
1. 复制CSOM依赖库到C++程序目录
C#项目编译时,若将CSOM相关DLL的复制本地属性设为True,这些文件会输出到C# DLL的编译目录。需要把以下核心DLL复制到C++可执行文件的同一目录下:
Microsoft.SharePoint.Client.dllMicrosoft.SharePoint.Client.Runtime.dll- 其他CSOM相关的依赖DLL(如
Microsoft.SharePoint.Client.Publishing.dll等,根据你的使用情况添加)
设置"复制本地"的方法:在C#项目的引用中找到这些CSOM组件,右键→属性,将"复制本地"改为True。
2. 添加C++程序的应用程序配置文件
创建与C可执行文件同名的.config文件(例如你的C程序是MyCppApp.exe,则配置文件名为MyCppApp.exe.config),添加.NET程序集绑定重定向,确保C++进程能找到正确版本的CSOM组件。示例配置如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.SharePoint.Client" publicKeyToken="71e9bce111e9429c" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-16.0.0.0" newVersion="16.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.SharePoint.Client.Runtime" publicKeyToken="71e9bce111e9429c" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-16.0.0.0" newVersion="16.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:newVersion的值要与你安装的SharePoint Online CSOM包版本一致,可以在NuGet包管理器中查看具体版本号。
3. 匹配平台与.NET运行时环境
- 确保C++项目的目标平台(x86/x64)与C# DLL的目标平台完全一致,避免因位数不匹配导致的组件加载失败。
- 确认运行C++程序的机器已安装对应版本的.NET Framework(SharePoint Online CSOM通常要求.NET Framework 4.6.1及以上版本)。
4. 用Fusion日志排查具体加载失败的组件
若上述方法仍未解决问题,可以开启.NET Fusion日志查看具体是哪个组件加载失败:
- 以管理员身份打开命令提示符,执行以下命令:
reg add HKLM\Software\Microsoft\Fusion /v EnableLog /t REG_DWORD /d 1 /v LogPath /t REG_SZ /d C:\FusionLogs - 创建
C:\FusionLogs目录(如果不存在)。 - 运行你的C++程序,触发错误后,查看
C:\FusionLogs下的日志文件,定位到具体找不到的DLL,再针对性处理。
内容的提问来源于stack exchange,提问作者user1961169
相关产品推荐
相关产品推荐

