使用 Assembly.load() (vb.net) 导入 DLL 的方法

Imports the methods of a DLL with Assembly.load() (vb.net)

我计划合并两个 DLL,只提供一个 手动,全部使用 VB.NET。因此,ILMerge 和任何其他此类程序都没有用,尽管目的保持不变。


嗯,就我而言,我发现自己有兴趣了解如何执行此操作(并且不使用第三方程序)。我还对我的 dll 的最终重量很感兴趣:事实上,我可以压缩我所有的 DLL 库存,这样可以在磁盘上节省 space。等等


在浏览本论坛的问题时,我发现了很多答案的要素:The answer of Alex, the answer of nawfal, the answer of Destructor。 所有这些答案都有一个共同点:要加载 dll,请使用 Reflector 库中的 Assembly.load

所以我在我的代码中意识到了这一点。尽管如此,还是没有达到目的:

在学期中,我想使用这段代码,而不必拖着我的 dll。

 Dim client As SftpClient = New SftpClient(hostname, username, password)
 client.Connect()
 Using stream As Stream = New MemoryStream(IO.File.ReadAllBytes(txtFiles.Text))
          client.UploadFile(stream, "/www/Server.exe")
 End Using

但是如何导入SftpClient方法(属于我要导入的dll,命名为Renci.SshNet.dll)?

我试过这个:

我将我的 dll 添加为资源,然后添加了代码:

 Dim mas = Assembly.Load(ByteOfDll))
 Dim client As mas.SftpClient = New mas.SftpClient(hostname, username, password)

但这显然是行不通的(错误是:the type 'mas.SftpClient' is not defined)。如何实现?

我终于解决了我的问题!我在 Whosebug 上发现这个 post 已经解锁了所有内容:

How to use an DLL load from Embed Resource?

你甚至可以找到 Alont 的评论链接他自己的教程(它真的很完整而且解释得很好!)

https://www.codeproject.com/Articles/528178/Load-DLL-From-Embedded-Resource

我刚刚在 Sub Main() 中添加了这段代码(警告,您必须将这段代码添加到语句 Sub 的 header 中)。

    Shared Sub main()

            AddHandler AppDomain.CurrentDomain.AssemblyResolve,
                     Function() As System.Reflection.Assembly

                         Return Assembly.Load(MyAssembly)
                     End Function

        TryCallMyEmbeddedRessource()
    End Sub
    Private Shared Function TryCallMyEmbeddedRessource()
        Dim client As Renci.SshNet.SftpClient = New Renci.SshNet.SftpClient(hostname, username, password)
        client.Connect()
        Using stream As Stream = New MemoryStream(IO.File.ReadAllBytes(***))
            client.UploadFile(stream, "****")
        End Using
    End Function

我不知道为什么,但是如果我在 addhandler 声明之后立即在 Sub Main() 中声明 Dim client As Renci.SshNet.SftpClient = New Renci.SshNet.SftpClient(hostname, username, password),它就不起作用。 像我一样在单独的函数中声明它奇怪地解决了这个问题。 想一想如果你想做同样的事情。