C#模块预计包含程序集清单

时间:2012-07-05 11:58:50

标签: c# dll

嗨,我是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”的帮助表示赞赏...

问题解决了,谢谢所有

3 个答案:

答案 0 :(得分: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中包含的非托管函数执行相同的操作。您必须检查文档以查看确切的非托管签名,这将有助于您定义托管包装。

答案 1 :(得分:3)

尝试清理解决方案,然后重新构建。这对我来说非常好。

答案 2 :(得分:0)

  

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

不,不。您可以在项目中添加对DLL的引用(因为它is a managed assembly),然后使用DLL中的类及其方法。

您将收到有关使用哪些类别和方法以及所需参数的文档。

第一年我不会支付640欧元,而下一年每年只需支付320欧元的ZIP库,但这可能有点偏离主题。