gpt4 book ai didi

c# - 在 ASP.NET 调试期间使用 Activator.CreateInstanceFrom 时类型不匹配

转载 作者:行者123 更新时间:2023-11-30 17:04:04 31 4
gpt4 key购买 nike

在我正在处理的项目中,我创建了一个 AppDomain 并告诉它加载当前正在执行的程序集。然后我调用 Activator.CreateInstanceFrom 来创建内部类(MyType 类型)的编码实例(您可以看到它也使用相同的程序集位置):

        ObjectHandle handle = Activator.CreateInstanceFrom(
Factory.operatingDomain,
Assembly.GetExecutingAssembly().Location,
typeof(MyType).FullName,
false,
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new object[] { config },
null,
null);

当我对该程序集进行单元测试时一切正常,但在 ASP.NET 调试环境中使用它时,它会抛出 MissingMethodException。我花时间创建自己的扩展 Binder 的类,看看会发生什么。唯一的区别似乎是在调试环境中,传入的参数 (config) 从位于常规目录的程序集中获取其类型,而 ParameterInfo 对象获取它的类型来自位于 ASP.NET 临时文件夹中的程序集。

即使我传递了 typeof(config).Assembly.Location,我也会得到相同的结果。所以它是框架内部的东西。

除了保留一个在参数类型根据 FullName 匹配时返回 true 的小众用途内部可访问自定义绑定(bind)器之外,我能做些什么来纠正这个问题吗?

更新

我已经尝试传递从应用程序域的已加载程序集中获取的程序集位置,但仍然没有成功。我的自定义 Binder 也不起作用——它需要我实现 Binder.ChangeType ,我发现我什至无法从一种类型转换为另一种类型(尽管如前所述,它们之间的唯一区别是位置大会的。)

更新 2

我尝试了以下代码以确保应用域从正确的位置加载正确的程序集:

        if (binPath != String.Empty)
{
Factory.operatingDomain.SetData("assemblyLocation", Assembly.GetExecutingAssembly().Location);

Factory.operatingDomain.DoCallBack(() =>
{
String location = AppDomain.CurrentDomain.GetData("assemblyLocation").ToString();
String filename = System.IO.Path.GetFileName(location);
List<String> paths = AppDomain.CurrentDomain.RelativeSearchPath.Split(';').ToList();

foreach (String path in paths.ToArray())
{
paths.Remove(path);
paths.AddRange(System.IO.Directory.GetFiles(path, filename));
}

Assembly.LoadFrom(paths[0]);
});
}

没错!它加载了正确的程序集!但是在这里,稍晚一点:

String location = Factory.operatingDomain
.GetAssemblies()
.Single(a => a.FullName == Assembly.GetExecutingAssembly().FullName)
.Location;

这将返回 .NET 临时文件夹路径。那是不对的。我认为这是框架中的错误!

最佳答案

您的应用是什么? ASP.NET 应用程序?如果是的话,您应该知道一个名为 assembly shadow copy 的野兽(参见 http://msdn.microsoft.com/en-us/library/ms404279.aspx )。这个东西在ASP.NET中是默认使用的。简而言之,当您将位于 bin 文件夹中的程序集与 ASP.NET 应用程序程序集一起使用时,它会被复制到 ASP.NET 临时文件夹并从那里加载。

为确保这是导致您遇到的行为的原因,请尝试将定义“config”参数类型的程序集放入某个单独的文件夹中,并通过捕获 AppDomain_AssemblyResolve 事件加载程序集或在使用前手动加载它。这样您将忽略程序集卷影复制行为。

关于c# - 在 ASP.NET 调试期间使用 Activator.CreateInstanceFrom 时类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17958728/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com