【问题标题】:Imports the methods of a DLL with Assembly.load() (vb.net)使用 Assembly.load() (vb.net) 导入 DLL 的方法
【发布时间】:2019-12-12 23:48:37
【问题描述】:

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


  • 执行此操作的复杂生活有什么意义 如果我们可以使用 ILMerge,可以手动进行吗?

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


在浏览本论坛的问题时,我发现了很多答案元素:The answer of Alex,答案of nawfal,答案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)。如何做到这一点?

【问题讨论】:

  • 我不太确定这里的问题是什么。从表面上看,您是在寻求一篇关于如何重新实现 ILMerge 的论文?
  • 顾名思义,用Assembly.load()导入DLL的方法。最后,我想手动做 ILmerge 所做的事情
  • ILMerge 非常复杂。你不能期望这里给出如何重新实现它的所有细节的答案。您需要将问题的焦点缩小到一个特定的问题。您可以从阅读 ILMerge 的源代码开始。
  • 我不想重写 ILmerge。我在我的问题中提到了一个例子。这个例子很好地描述了我的目标。如果您查看我写的内容,我还提到了其他 stackoverflow 帖子的一些回复。这些答案朝着我的目标方向发展,但我需要更多关于这些的细节。一个简单的“Assembly.load()”不允许使用我的 dll。
  • 好的。我迷路了。我不知道你在问什么。我试图帮助您详细说明,但您显然不想这样做。让我们看看这个问题有多大的吸引力。你看过 ILMerge 源代码吗?

标签: vb.net merge .net-assembly dllimport ilmerge


【解决方案1】:

我终于设法解决了我的问题!我在 stackoverflow 上发现了这篇文章,它已经解锁了所有内容:

How to use an DLL load from Embed Resource?

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

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

我刚刚在我的Sub Main() 中添加了这个小代码(警告,您必须将此代码添加到语句 Sub 的标题中)。

    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 声明之后立即声明 Dim client As Renci.SshNet.SftpClient = New Renci.SshNet.SftpClient(hostname, username, password),在 Sub Main() 中,它不起作用。 像我一样在单独的函数中声明它奇怪地解决了这个问题。 想想你是否想做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多