嗨,我是C#世界的新手.我不得不使用它,因为依赖于来自多播源的xceedzip.dll压缩数据.在将一些代码用于接收订阅源之后,我面临着调用此dll的障碍.据我所知,我需要使用"System.Reflection"并调用dll.
目前我的源代码和dll位于同一目录中.代码编译成功.
Assembly ass = Assembly.Load("XceedZip");
Run Code Online (Sandbox Code Playgroud)
我在运行时遇到System.BadImageFormatException:无法加载文件或程序集"XceedZip"或其依赖项之一.该模块应该包含一个程序集清单.
请帮忙,谢谢
#好的,谢谢你的所有回复,我有一个工作版本的dll跟随tlbimp命令加载到我的环境中.我遇到了Uncompress方法签名的问题.我需要提供一个"ref对象"和一个"out对象"作为源(压缩)和目标(未压缩)对象.我尝试将字节数组加载到这些位置,但它会抛出一个无效的参数错误.帮助"ref对象"和"out object"赞赏...
问题解决了,谢谢大家
我怀疑这个DLL不是托管程序集,但包含本机代码.该Assembly.Load只应与管理组件使用.如果需要从非托管代码调用函数,可以使用P/Invoke.该过程涉及为要调用的非托管函数定义托管包装器.
例如,如果你想调用MessageBox本机函数(实际上你永远不需要这样做,因为已经有一个托管等价物,但是为了这个演示的目的应该没问题)你可以编写一个包装器:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern MessageBoxResult MessageBox(IntPtr hWnd, String text, String caption, int options);
Run Code Online (Sandbox Code Playgroud)
然后调用它:
MessageBox(IntPtr.Zero, "Text", "Caption", 0);
Run Code Online (Sandbox Code Playgroud)
您必须使用DLL中包含的非托管函数执行相同的操作.您必须检查文档以查看确切的非托管签名,这将有助于您定义托管包装器.