C#生成DLL通过Overwolf调用时无法加载Interop.iTunesLib求助
我尝试通过编写C# DLL并借助Overwolf API在TypeScript中调用的方式访问iTunes,具体操作如下:
已执行操作
- 生成.dll文件
- 引入iTunesLib并创建类库项目,在Windows Forms应用中测试功能正常
- 生成的类库代码如下:
namespace MyNamespace{ public class MyClass { public void myFunction() { iTunesLib.iTunesAppClass iTunesApp = new iTunesLib.iTunesAppClass(); // 对iTunesApp执行相关操作.... } } }
- 在TypeScript中调用C#函数:
overwolf.extensions.current.getExtraObject("myNamespace", (result) => { if (result.success) { pluginInstance = result.object; pluginInstance.myFunction(); // 调用C#函数 } }
错误报告
ERROR: Error: Failed to execute PauseITunes on AudioController with 0 arguments. details:
System.Reflection.TargetInvocationException: target threw an exception ---> System.IO.FileNotFoundException: Could not load file or assembly 'Interop.iTunesLib, Version=1.13.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies when deploying the application
Where MyNamespace.MyClass.myFunction()
该功能在Windows Forms应用中可正常运行,但打包为DLL后通过Overwolf调用就失效,错误出在iTunesLib相关部分,请问这是为什么?
核心原因
Overwolf运行环境找不到iTunesLib对应的互操作程序集(Interop.iTunesLib.dll),导致加载失败。以下是具体分析和解决办法:
依赖程序集未一同部署
Windows Forms测试时,Visual Studio会自动把依赖的Interop.iTunesLib.dll复制到输出目录,但打包Overwolf插件时,你只部署了自己写的MyNamespace.dll,没把依赖的互操作程序集一起放进插件目录。Overwolf加载你的DLL时找不到依赖文件,就会抛出FileNotFoundException。启用互操作类型嵌入
在Visual Studio中修改iTunesLib引用的属性,把**"嵌入互操作类型"设置为True**。这样编译时,Visual Studio会把iTunesLib的互操作代码直接嵌入到你的MyNamespace.dll里,不需要单独部署Interop.iTunesLib.dll。操作步骤:
- 在类库项目的引用列表中找到iTunesLib
- 右键选择「属性」
- 将「嵌入互操作类型」改为True
- 重新生成DLL
确保依赖文件路径正确
如果不想嵌入互操作类型,必须把Interop.iTunesLib.dll和你的MyNamespace.dll放在同一个目录下,或者确保Overwolf的程序集搜索路径能找到它。Overwolf插件的部署目录需要包含所有依赖的程序集,不能只放自己的DLL。检查平台位数兼容性
iTunes的COM组件是32位的,如果你编译类库时用的是Any CPU或64位,可能会导致加载失败。确保你的C#类库编译目标平台设置为x86,和iTunes的位数匹配。
内容的提问来源于stack exchange,提问作者yolo

