本文将为您提供关于c#–GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?的详细介绍,我们还将为您解释c#中get和set的相关知识,同时
本文将为您提供关于c# – GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?的详细介绍,我们还将为您解释c#中get和set的相关知识,同时,我们还将为您提供关于.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?、5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程、asp.net-mvc – AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的差异、asp.net-mvc – scanMap的目的.CallingAssembly,scan.WithDefaultConventions in StructureMap-MVC3的实用信息。
本文目录一览:- c# – GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?(c#中get和set)
- .net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?
- 5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程
- asp.net-mvc – AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的差异
- asp.net-mvc – scanMap的目的.CallingAssembly,scan.WithDefaultConventions in StructureMap-MVC3
c# – GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?(c#中get和set)
现在GetExecutingAssembly()有何不同? JIT内联在技术上可以内联调用GetExecutingAssembly()的代码,因此代码现在属于不同的程序集,并且取决于是否发生GetExecutingAssembly()也可以产生不同的结果.
为什么GetExecutingAssembly()描述没有提到类似于GetCallingAssembly()描述的JIT inining?
解决方法
这两个方法都声明了一个特殊枚举StackCrawlMark的局部变量,并将其初始化为StackCrawlMark.LookForMyCaller.此局部变量具有防止调用GetExecutingAssembly或GetCurrentMethod的方法被内联的副作用,这将保证正确的结果.
这可以通过实验以及SSCLI20中与此枚举相关的注释来支持:
// declaring a local var of this enum type and passing it by ref // into a function that needs to do a stack crawl will both prevent inlining of // the calle and pass an ESP point to stack crawl to // // Declaring these in EH clauses is illegal; // they must declared in the main method body
GetCallingAssembly易受影响的原因是因为您正在寻找调用者的调用者,并且局部变量仅保证调用者没有内联,这意味着可以内联祖父素方法导致意外结果.
.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?
> Phone 7.0+
> .Net 1.0
> Portable Class Libraries
但是,不支持的位置直接位于Windows应用商店应用程序中.我可以创建一个可移植的类库,然后从Windows应用程序内部调用它,但我不能直接将它放在Windows应用商店应用程序/类库中.
是否有解决方法来获取由Assembly提供的元数据类型或其他方式?
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 入门教程
在 Rust 中创建一个简单的 WebAssembly 应用程序,然后从 JavaScript 调用这个程序本文所涉及的所有代码可以在 https://github.com/second-sta... 中找到。
系列教程:
- WebAssembly 快问快答
- Rust 的 Hello world
在本教程中,我们将创建一个非常简单但很完整的 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 示例。
asp.net-mvc – AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的差异
解决方法
AppDomain.GetAssemblies()提供已经加载到当前AppDomain中的所有程序集。 BuildManager.GetReferencedAssemblies()返回从Web.config和其他地方引用的所有程序集的列表,并将这些程序集加载到当前的AppDomain中。
这里有一个实例的上述。
> SomeMethod()还没有运行。
>调用AppDomain.GetAssemblies(),返回一个不包含ThirdParty.dll的集合。
>调用SomeMethod()。
>调用AppDomain.GetAssemblies(),返回包含ThirdParty.dll的集合。
在这个例子中,CLR推迟将ThirdParty.dll加载到当前的AppDomain中,直到它是绝对必要的。因为它是必要的执行SomeMethod(),这是当它被加载。
或者:
> SomeMethod()还没有运行。
>调用AppDomain.GetAssemblies(),返回一个不包含ThirdParty.dll的集合。
>调用BuildManager.GetReferencedAssemblies(),返回一个包含ThirdParty.dll的集合。
>调用AppDomain.GetAssemblies(),返回一个包含ThirdParty.dll的集合。
在这里,即使您从未调用SomeMethod(),对BuildManager.GetReferencedAssemblies()的调用已经代表您将第三方库加载到当前的AppDomain中。
当然,这一切都要经过某些优化等,但一般的想法是成立的。
asp.net-mvc – scanMap的目的.CallingAssembly,scan.WithDefaultConventions in StructureMap-MVC3
添加一个包含Initialize方法的IoC类(由App_Start文件夹中的某些代码调用),其中包含以下内容:
public static class IoC { public static IContainer Initialize() { ObjectFactory.Initialize(x => { x.Scan(scan => { scan.TheCallingAssembly(); scan.WithDefaultConventions(); }); // x.For<IExample>().Use<Example>(); }); return ObjectFactory.Container; } }
scan.CallingAssembly()和scan.WithDefaultConventions()代码的目的是什么?我在StructureMap documentation中看不到这些方法的好解释.
在非MVC项目中使用StructureMap时,我发现可以删除整个x.Scan部分而不会产生任何影响.
解决方法
WithDefaultConventions意味着:“如果在扫描时我找到了一个接口IExample,并且有一个类型示例实现了IExample,那么将Example注册为IExample的默认类型”.
在许多情况下,您将能够向容器询问您要查找的内容(IExample),并且它将返回实现,而无需任何进一步的配置.
关于c# – GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?和c#中get和set的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于.net – WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?、5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程、asp.net-mvc – AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的差异、asp.net-mvc – scanMap的目的.CallingAssembly,scan.WithDefaultConventions in StructureMap-MVC3等相关内容,可以在本站寻找。
本文标签: