是否有可能将非托管DLL转换为托管DLL?
答案 0 :(得分:7)
您可以为DLL编写包装器类。这些很受欢迎。第三方库提供程序通常提供包装其DLL API的封装.NET程序集(用C ++,C等编写)。
在你的包装器类中,只有DllImport
库DLL中的所有API函数。然后就像任何.NET类方法一样使用这些函数。
但是,在实践中,您有时必须编写自己的.NET兼容方法来调用这些导入的函数,因为您需要提供参数类型映射和其他检查。
还考虑提供方便的重载方法,因为CLR支持它们而不是所有非托管库都可以。
或者,如果该非托管DLL是一个COM模块而您只是想按原样使用它,并且如果您使用的是Visual Studio,则只需“添加引用”即可,Visual Studio将自动创建一个Interop包装类对你而言。
如果您的非托管DLL不是COM模块,但您仍希望将其自动转换为符合CLR的程序集(无需编写包装类),则必须记录IDL文件中的所有API函数。通常,如果您的库是C ++或C DLL,它们将具有C ++ / C源格式的头文件,可以很容易地重构为IDL文件(使用C语法)。然后使用midl
为该DLL创建类型库。然后,您可以使用tlbimp
将该类型库转换为.NET程序集。
答案 1 :(得分:2)
如果您有源代码并且它是C ++,则可以使用C++/CLI。如果它是Delphi,您可以使用Delphi Prism(没有个人经验)。这不是一个简单的“开放和重新编译”,但从我所听到的,它是相当直接的,除非你做疯狂的东西(嗯,哪个C ++开发人员没有?: - ))
如果您没有源代码,则无法对其进行转换,但您仍可以通过P/Invoke从托管代码中使用它。