C# 从C+显式链接DLL+;项目-(7zip,7z.dll)

C# 从C+显式链接DLL+;项目-(7zip,7z.dll),c#,dll,c++-cli,7zip,C#,Dll,C++ Cli,7zip,我试图在我的应用程序代码中使用7zip。在7zip的网站上,他们说我可以使用7z.dll。所以,我试着从C#中引用它,但没有成功。因此,我决定编写一个引用7Z.DLL的C++库,然后我可以引用C语言中的那个库。 我可以在我的C++库中加载库(我想),我可以引用C语言中的那个库,并成功调用一个方法。 但是,我不知道如何找出7z.dll库中的方法名,以便调用它们 汉斯·帕桑(Hans Passant)指出了七个问题,这使得我的回答毫无用处;-)我将把它留给纯粹的教育目的。如果其他人已经为您编写了CO

我试图在我的应用程序代码中使用7zip。在7zip的网站上,他们说我可以使用7z.dll。所以,我试着从C#中引用它,但没有成功。因此,我决定编写一个引用7Z.DLL的C++库,然后我可以引用C语言中的那个库。

我可以在我的C++库中加载库(我想),我可以引用C语言中的那个库,并成功调用一个方法。 但是,我不知道如何找出7z.dll库中的方法名,以便调用它们


汉斯·帕桑(Hans Passant)指出了七个问题,这使得我的回答毫无用处;-)我将把它留给纯粹的教育目的。如果其他人已经为您编写了COM互操作包装,则无需编写自己的COM互操作包装


我看了他们的C++示例(CPP/7ZIP/UI/clit7z下)。一切都是使用COM接口和各种类型的回调来完成的

虽然C#具有出色的COM互操作支持,但它需要在C#中重新说明相关的COM接口,或者可能使用后期绑定
dynamic
magic。但是,对于7z大小的项目来说,这两个选项都非常重要,因此仔细想想,最好还是坚持使用C++/CLI包装方法

在该示例中,您可以确切地看到
main
是如何实现的:它加载DLL(围绕
LoadLibrary
调用使用包装类
NDLL::CLibrary
),然后获取指向COM
CreateObject
函数的指针(通过内部执行
GetProcAddress
的同一个包装)


获得
CreateObject
函数的地址后,可以使用适当的应用程序和接口GUID调用该函数,以获取实现它们的对象实例,然后可以使用这些对象执行实际工作。Hans Passant指出,接口本身是在头文件中声明的,例如
IArchive.h

Hmm,这使得我的回答毫无用处;-)我将把它留给纯粹的教育目的。如果其他人已经为您编写了COM互操作包装,则无需编写自己的COM互操作包装


我看了他们的C++示例(CPP/7ZIP/UI/clit7z下)。一切都是使用COM接口和各种类型的回调来完成的

虽然C#具有出色的COM互操作支持,但它需要在C#中重新说明相关的COM接口,或者可能使用后期绑定
dynamic
magic。但是,对于7z大小的项目来说,这两个选项都非常重要,因此仔细想想,最好还是坚持使用C++/CLI包装方法

在该示例中,您可以确切地看到
main
是如何实现的:它加载DLL(围绕
LoadLibrary
调用使用包装类
NDLL::CLibrary
),然后获取指向COM
CreateObject
函数的指针(通过内部执行
GetProcAddress
的同一个包装)


获得
CreateObject
函数的地址后,可以使用适当的应用程序和接口GUID调用该函数,以获取实现它们的对象实例,然后可以使用这些对象执行实际工作。接口本身在头文件(如
IArchive.h

中声明。您能举例说明您目前如何在测试代码中调用函数吗?您在哪里读到关于链接7z.dll的内容?在他们的网站上,我看到的大多是对的参考,这有点不同。滚动至底部:如何将对7z存档的支持添加到我的应用程序中?啊哈,太酷了。它们似乎为C++提供了一个例子。由于它是通过COM完成的,所以不需要手动编写C++/CLI包装器;C#具有出色的COM互操作支持。我来看看能不能举个例子。你能举个例子说明你目前如何在测试代码中调用函数吗?你在哪里读到关于链接7z.dll的内容?在他们的网站上,我看到的大多是对的参考,这有点不同。滚动至底部:如何将对7z存档的支持添加到我的应用程序中?啊哈,太酷了。它们似乎为C++提供了一个例子。由于它是通过COM完成的,所以不需要手动编写C++/CLI包装器;C#具有出色的COM互操作支持。我看看能不能举个例子。