GVKun编程网logo

c# – GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?(c#中get和set)

13

本文将为您提供关于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)

c# – GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?(c#中get和set)

有 Assembly.GetExecutingAssembly()和 Assembly.GetCallingAssembly().请注意,GetCallingAssembly()有一个备注,提到根据JIT内联的行为方式,一个方法可能(或没有)内联到另一个方法中,因此GetCallingAssembly()返回不同的结果.

现在GetExecutingAssembly()有何不同? JIT内联在技术上可以内联调用GetExecutingAssembly()的代码,因此代码现在属于不同的程序集,并且取决于是否发生GetExecutingAssembly()也可以产生不同的结果.

为什么GetExecutingAssembly()描述没有提到类似于GetCallingAssembly()描述的JIT inining?

解决方法

GetExecutingAssembly方法不容易受到JIT内联的影响,因为同样的原因,MethodBase.GetCurrentMethod也不会受到影响,因为它们是以类似的方式实现的.

这两个方法都声明了一个特殊枚举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,但适用于可移植类库?

.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-sta... 中找到。

教程3.png

系列教程:

  1. WebAssembly 快问快答
  2. 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之间的差异

asp.net-mvc – AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的差异

只是想知道两者之间是否有任何区别,在完全信任asp.net mvc 2应用程序的上下文中。

解决方法

.NET Framework会将组合件加载到当前AppDomain中,直到需要它们为止。例如,如果你只从SomeMethod()调用第三方库,第三方DLL通常不会被加载,直到第一次运行SomeMethod()。

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

asp.net-mvc – scanMap的目的.CallingAssembly,scan.WithDefaultConventions in StructureMap-MVC3

将 StructureMap-MVC3程序包添加到ASP.NET MVC应用程序时,
添加一个包含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部分而不会产生任何影响.

解决方法

扫描查看程序集中定义的所有类型,并应用StructureMap约定来确定它们是否应在容器中注册/如何注册.

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等相关内容,可以在本站寻找。

本文标签: