3

嗨,我是 C# 世界的新手。我不得不使用它,因为它依赖于来自多播源的 xceedzip.dll 压缩数据。在编写了一些用于接收提要的代码之后,我在调用这个 dll 时遇到了障碍。据我了解,我需要使用“System.Reflection”并调用 dll。

目前我的源代码和 dll 位于同一目录中。代码编译成功。

Assembly ass = Assembly.Load("XceedZip");

我在运行时收到 System.BadImageFormatException:无法加载文件或程序集“XceedZip”或其依赖项之一。该模块应包含程序集清单。

请帮忙,谢谢

#

好的,感谢您的所有回复,在将 tlbimp 命令加载到我的环境中之后,我有一个工作版本的 dll。我遇到了 Uncompress 方法签名的问题。我需要提供一个“ref 对象”和一个“out 对象”作为源(压缩)和目标(未压缩)对象。我尝试将字节数组加载到这些位置,但它抛出了一个无效的参数错误。对“ref object”和“out object”的帮助表示赞赏......

问题已解决,谢谢大家

4

3 回答 3

6

我怀疑这个 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);

然后调用它:

MessageBox(IntPtr.Zero, "Text", "Caption", 0);

您必须对包含在 DLL 中的非托管函数执行相同的操作。您将必须检查文档以查看确切的非托管签名,这将帮助您定义托管包装器。

于 2012-07-05T12:01:27.580 回答
3

尝试清理解决方案,然后再次构建。这项工作对我来说非常好。

于 2013-06-06T04:32:11.980 回答
0

据我了解,我需要使用“System.Reflection”并调用 dll。

不,你没有。您可以在项目中添加对 DLL 的引用(因为它是托管程序集),然后使用 DLL 中的类及其方法。

您将收到有关使用哪些类和方法以及它们期望哪些参数的文档。

对于一个单纯的 ZIP 库,我不会在第一年支付 640 欧元,然后每年支付 320 欧元,但这可能有点离题。

于 2012-07-05T12:07:37.180 回答