使用 Assembly.load() (vb.net) 导入 DLL 的方法
Imports the methods of a DLL with Assembly.load() (vb.net)
我计划合并两个 DLL,只提供一个 手动,全部使用 VB.NET。因此,ILMerge
和任何其他此类程序都没有用,尽管目的保持不变。
- 执行此操作使生活复杂化的意义何在
如果我们可以使用 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 已经解锁了所有内容:
你甚至可以找到 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)
,它就不起作用。
像我一样在单独的函数中声明它奇怪地解决了这个问题。 想一想如果你想做同样的事情。
我计划合并两个 DLL,只提供一个 手动,全部使用 VB.NET。因此,ILMerge
和任何其他此类程序都没有用,尽管目的保持不变。
- 执行此操作使生活复杂化的意义何在 如果我们可以使用 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 已经解锁了所有内容:
你甚至可以找到 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)
,它就不起作用。
像我一样在单独的函数中声明它奇怪地解决了这个问题。 想一想如果你想做同样的事情。