GVKun编程网logo

卸载用Assembly.LoadFrom()加载的Assembly(as卸载干净)

14

如果您对卸载用Assembly.LoadFrom感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于卸载用Assembly.LoadFrom的详细内容,我们还将为您解答加载的As

如果您对卸载用Assembly.LoadFrom感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于卸载用Assembly.LoadFrom的详细内容,我们还将为您解答加载的Assembly的相关问题,并且为您提供关于(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly、.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?、5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程、asp.net – System.Reflection.Assembly.LoadFile锁定文件的有价值信息。

本文目录一览:

卸载用Assembly.LoadFrom()加载的Assembly(as卸载干净)

卸载用Assembly.LoadFrom()加载的Assembly(as卸载干净)

加载dll后,我需要检查运行GetTypes()的时间。代码如下。

Assembly assem = Assembly.LoadFrom(file);sw = Stopwatch.StartNew();var types1 = assem.GetTypes();sw.Stop();double time1 = sw.Elapsed.TotalMilliseconds;

我想卸载并重新加载dll,以检查再次运行GetTypes()所花费的时间。

  • 如何卸载?assem = null够好吗?
  • 有没有一种明确的方法可以调用垃圾回收器来回收分配给Assem的资源?

答案1

小编典典

不幸的是,一旦装配被加载,您将无法卸载装配。但是您可以卸载AppDomain。您可以做的是创建一个新的AppDomain(AppDomain.CreateDomain(…)),将程序集加载到此appdomain中以进行处理,然后在需要时卸载AppDomain。卸载AppDomain时,将卸载所有已加载的程序集。(请参阅参考资料)

要调用垃圾收集器,您可以使用

GC.Collect(); // collects all unused memoryGC.WaitForPendingFinalizers(); // wait until GC has finished its workGC.Collect();

GC在后台线程中调用终结器,这就是为什么您必须等待并再次调用Collect()以确保删除了所有内容的原因。

(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly

(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly

WebAssembly很快。您可能已经听说了。但是,使WebAssembly快速运行的原因是什么?

在本系列中,我想向您解释为什么WebAssembly能够如此快速。

什么是WebAssember?

WebAssembly是一种使用除JavaScript以外的其他编程语言编写的代码并在浏览器中运行该代码的方法。因此,当人们说WebAssembly快速时,他们通常都是与JavaScript进行比较。

实际上,我们希望开发人员将在同一应用程序中同时使用WebAssembly和JavaScript。

但是将两者进行比较很有用,因此您可以了解WebAssembly的潜在影响。

JavaScript的一点历史

JavaScript创建于1995年。设计之初,她的速度并不是很快,并且在最初的十年中,她确实表现得并不是很快。

然后,浏览器开始变得更具竞争力。

在2008年,人们称之为特效战的时期开始了。多个浏览器添加了即时编译器,也称为JIT。在运行JavaScript时,JIT可以查看模式,并根据这些模式使代码运行得更快。

这些JIT的引入导致JavaScript性能出现拐点。JS的执行速度提高了10倍。

  

随着性能的提高,JavaScript开始用于人们从未期望过的用途,例如使用Node.js进行服务器端编程。通过提高性能,可以在全新的问题类别上使用JavaScript。

现在,WebAssembly可能使我们处于另一个拐点。

因此,让我们深入研究细节以了解使WebAssembly快速运行的原因。

 转自:https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/

.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?

.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?

我需要获得一些关于调用我的组件的程序集的元数据.因此,使用Assembly.GetCallingAssembly()似乎很自然.但是,我发现除了 Windows应用商店外,它无处不在.它支持的地方:

> Phone 7.0+
> .Net 1.0
> Portable Class Libraries

但是,不支持的位置直接位于Windows应用商店应用程序中.我可以创建一个可移植的类库,然后从Windows应用程序内部调用它,但我不能直接将它放在Windows应用商店应用程序/类库中.

是否有解决方法来获取由Assembly提供的元数据类型或其他方式?

Assembly.GetCallingAssembly没有在WinRT中公开 – 据说是因为它的语义在内联等方面是不可靠的( source),但它也不适合Windows Store应用程序中允许的受限反射.你可以得到像Assembly.GetCurrentAssembly()这样的东西,例如:
typeof(MainPage).GetTypeInfo().Assembly

但那根本不一样.使用受限制的反射模型,也无法在.NET中获得运行时的堆栈跟踪.

至于可移植类库,我当然会说可以在可移植类库中支持Assembly.GetCurrentAssembly(),但不是在WinRT中 – 如果它不在那个平台中就有意义.但实际上,它似乎存在于包括WinRT在内的所有配置文件中,除了WinRT .NET4.5之外 – 似乎必须在某种程度上忽略这种不一致性.因此该方法存在于WinRT中(而且还没有进行重定向),但在编译时可用的元数据中不可见.

因此,您可以使用反射调用该方法:

var assembly = (Assembly) typeof(Assembly).GetTypeInfo()
    .GetDeclaredMethod("GetCallingAssembly")
    .Invoke(null,new object[0]);

我认为在Windows应用商店应用中这种方法的不可见性是“我们希望这会消失”.

(这个答案只涉及“我可以”而不是“我应该”).

5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程

5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程


在 Rust 中创建一个简单的 WebAssembly 应用程序,然后从 JavaScript 调用这个程序
本文所涉及的所有代码可以在 https://github.com/second-state/wasm-learning/tree/master/browser/triple 中找到。
系列教程
1. WebAssembly 快问快答
2. Rust 的 Hello world | WebAssembly 入门教程
在本教程中,我们将创建一个非常简单但很完整的 WebAssembly 应用程序。
Webassembly 应用程序通常由两部分组成。
  • 运行在 WebAssembly 虚拟机内部以执行计算任务的字节码程序
  • 提供 UI、networking、数据库,以及调用 WebAssembly 程序以执行关键计算任务或业务逻辑的主机应用程序
在本教程中,主机应用程序是用 JavaScript 编写的,并在 web 浏览器中运行。Webassembly 字节码程序是用 Rust 编写的。
现在,先让我们看看 Rust 程序是如何编写的。

在 Rust 中的 WebAssembly 程序


在这个例子中,Rust 程序将输入数字简单地增加了三倍并返回结果。首先将 WebAssembly 工具安装到 Rust 编译器。
  
    
  
  
  
# Install Rust

$
sudo apt-get update
$ sudo apt-get -y upgrade
$ curl --proto ''=https'' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
  
    
  
  
  
# Install WebAssembly tools

$ rustup target add wasm32-wasi
$ rustup override set nightly
$ rustup target add wasm32-wasi --toolchain nightly
接下来,创建一个新的  cargo 项目。由于这个程序是从主机应用程序调用的,而不是作为独立的可执行文件运行,因此我们将创建一个  lib 项目。
  
    
  
  
  
$ cargo new --lib triple
$ cd triple
编辑  Cargo.toml 文件以添加 [lib]节。它会告诉编译器在哪里可以找到库的源代码,以及如何生成字节码输出。
  
    
  
  
  
[lib]
name = "triple_lib"
path = "src/lib.rs"
crate-type =["cdylib"]
下面是 Rust 程序  src/lib.rs 的内容. 实际上,你可以在这个库文件中定义多个外部函数,并且所有这些函数都可以通过 WebAssembly 在 JaveScript 主机上使用。
  
    
  
  
  
#[no_mangle]
pub extern fn triple(x: i32) -> i32 {
return 3 * x;
}
接下来你可以用下面的命令行编译 Rust 的源代码到WebAssembly的字节码中。
  
    
  
  
  
$ cargo +nightly build --target wasm32-wasi --release
WebAssembly 字节码文件是  target/wasm32-wasi/release/triple_lib.wasm


JavaScript 主机


我们使用 JavaScript 加载 WebAssembly 字节码程序并调用它的函数。由于大多数浏览器已经支持 WebAssembly, JavaScript 实际上可以作为一个网页运行。
无须赘述,下面是 JavaScript 模块的相关部分,用于加载、导出和调用 WebAssembly 函数。完整的网页源文件在这里。
  
    
  
  
  
<script>
if (!(''WebAssembly'' in window)) {
alert(
''you need a browser with wasm support enabled :('');
}
(
async () => {
const response = await fetch(''triple_lib.wasm'');
const buffer = await response.arrayBuffer();
const module = await WebAssembly.compile(buffer);
const instance = await WebAssembly.instantiate(module);
const exports = instance.exports;
const triple = exports.triple;

var buttonOne = document.getElementById(''buttonOne'');
buttonOne.value =
''Triple the number'';
buttonOne.addEventListener(
''click'', function() {
var input = $("#numberInput").val();
alert(input +
'' tripled equals '' + triple(input));
},
false);
})();
</script>
可以看到 JavaScript 代码加载了 WebAssembly 虚拟机的  triple_lib.wasm 文件, 导出其外部函数,然后根据需要调用这些函数。
将这个 HTML 文件和  triple_lib.wasm 文件放在web 服务器上,你就可以访问网页,在网页上输入的任何数字会自动乘以三。
那么字符串呢?
现在你注意到了,这个例子并不是一个 hello world。WebAssembly函数计算数字,但不会像 hello world 那样操作字符串。
这是为什么呢?我们将在下一个教程中回答这个问题,并给出一个真实的 hello world 示例。

微信不支持添加原文,可点击阅读原文,查看文中所提资源

本文分享自微信公众号 - WebAssembly 中文社区(webassemblywasm)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

asp.net – System.Reflection.Assembly.LoadFile锁定文件

asp.net – System.Reflection.Assembly.LoadFile锁定文件

我通过System.Reflection.Assembly.LoadFile加载一个DLL,并在一个插件式系统中反映它的成员。
我需要能够更新/覆盖这些DLL,而系统正在运行,但似乎在调用System.Reflection.Assembly.LoadFile后,该文件随后被锁定。
有谁知道一个方法来解锁文件?
我已经阅读关于在单独的应用程序域中加载文件?这种方法有什么缺陷吗?

解决方法

如果你使用这个:
System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path))

它不会锁定该文件。

编辑

虽然这是工作,但它不是最好的解决方案,但更好的方式是更多的参与(太多的只是粘贴所有的代码在这里)。

我在Github上创建了一个公共存储库,其中包含所有正确执行此操作的代码:

Loading Assemblies without Locking by using Shadow Copying.

关于卸载用Assembly.LoadFrom加载的Assembly的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly、.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?、5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程、asp.net – System.Reflection.Assembly.LoadFile锁定文件的相关信息,请在本站寻找。

本文标签:

上一篇几秒钟后关闭MessageBox(自动关闭messagebox)

下一篇如何解决javax.net.ssl.SSLHandshakeException错误?(java.net.ssl.sslhandshake怎么办)