javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

c#-“对象已断开连接或在服务器上不存在”异常

我需要在我的应用程序中使用跨应用程序域调用,有时我会遇到以下RemotingException:

服务器上的对象'/2fa53226_da41_42ba_b185_ec7d9c454712/ygiw+xfegmkhdinj7g2kpkhc_7.rem'已断开连接或不存在。

目标对象仍然存在,我已经检查了它。

UPD我已经在目标对象的终结器中设置了断点,但是它从未命中。 因此,该对象是活动的,没有经过GC处理。

trans by 2020-08-11T05:33:00Z

CodeGo.net>如何从主AppDomain卸载程序集?

我想知道如何卸载加载到主AppDomain中的程序集。

我有以下代码:

var assembly = Assembly.LoadFrom( FilePathHere );

完成后,我需要/希望能够卸载此程序集。

谢谢你的帮助。

trans by 2020-08-10T03:18:39Z

.net-使用AppDomain的好例子

在访谈中,我不断被问到有关AppDomain的问题,我知道一些基本知识:

  • 它们是应用程序中的隔离级别(使它们与应用程序不同)
  • 他们可以有线程(使它们不同于线程)
  • 一个应用程序域中的异常不会影响另一应用程序域
  • 应用程序域无法访问彼此的内存
  • 每个应用程序域可以具有不同的安全性

我仍然不明白什么使他们必要。 我正在寻找一个合理的具体环境,以供您使用。

答案:

  • 不受信任的代码
    • 核心应用程序受保护
      通过在具有安全限制的单独应用程序域中进行隔离,禁止不受信任的/第三方插件破坏共享内存和未经授权的访问注册表或硬盘驱动器,从而保护应用程序或服务器。 例如 ASP.NET和SQL Server托管组件代码
  • 受信任的代码
    • 稳定性
      将应用程序细分为安全,独立的功能
    • 架构灵活性
      可以在单个CLR实例或每个程序中单独运行多个应用程序。

还要别的吗?

trans by 2020-06-24T11:48:21Z

c#-在.NET 4.0中,如何“沙盒化”内存中的程序集并执行方法?

提出此问题的原因如下:www.devplusplus.com/Tests/CSharp/Hello_World。

虽然之前也曾问过类似的问题,但在线上的许多答案都有几个问题:

  1. 这必须以“ .Net 4.0”样式完成,而不是传统模式。
  2. 程序集在内存中,并且仅在内存中,无法将其写入文件系统。
  3. 我想限制对文件系统,网络等的所有访问。

像这样:

    var evidence = new Evidence();
    evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
    var permissionSet = SecurityManager.GetStandardSandbox(evidence);

到目前为止,我还没有找到一种创建AppDomain并加载程序集的方法,该方法不在文件系统上,而是在RAM中。

再次指出,其他解决方案不起作用的原因已在上面指出:1.许多解决方案适用于4.0之前的版本;以及2.许多依靠指向文件系统的“ .Load”方法。

答案2:我有一个程序集引用,因为它是由2936965929412068368352类生成的,因此,如果您知道将其转换为字节数组的方法,那就太完美了!

显示安全缺陷的示例代码

var provider = new CSharpCodeProvider(new Dictionary<String, String>
    { { "CompilerVersion", "v4.0" } });

var compilerparams = new CompilerParameters
    { GenerateExecutable = false, GenerateInMemory = true, };

var compilerResults = provider.CompileAssemblyFromSource(compilerparams,
    string_Of_Code_From_A_User);

var instanceOfSomeClass = compilerResults.CompiledAssembly
    .CreateInstance(className);

// The 'DoSomething' method can write to the file system and I don't like that!
instanceOfSomeClass.GetType().GetMethod("DoSomething")
    .Invoke(instanceOfSomeClass, null);

那么为什么不能先将程序集保存到文件中呢?

有两个原因:

  1. 此代码位于对文件系统本身具有有限权限的共享Web服务器上。
  2. 这段代码可能需要运行数千次,而且我暂时不需要1,000个dll。
trans by 2020-06-24T10:29:34Z

c#-由于AppDomain,在项目之间交叉时,通过Resharper 8测试运行NUnit失败

我最近更新为Resharper 8,并尝试运行一系列项目时。 这些测试包含两个集成测试套件,它们都使用IISExpress来运行网站,发出Web请求并检查响应。

孤立地运行它们是成功的,并且先前运行所有测试都将成功。 但是,更新之后,要运行的第二组测试将失败。

调查显示/domain:Single仍是第一个要运行的测试,而不是进行更改。 由于集成测试由两个项目组成,因此导致第二个项目失败,因为它找不到所需的任何配置文件。

我在Resharper 8中找不到任何选项来禁用此不同行为,这似乎是/domain:Single nunit标志的行为。 没有降级为Resharper 7,有人知道解决方案吗? 这是Resharper 8的预期行为还是bug?

trans by 2020-02-14T19:41:30Z

c#-替换Process.AppDomains开始

背景

我有一个Windows服务,该服务使用各种第三方DLL对PDF文件执行工作。 这些操作可能会占用大量系统资源,并且偶尔会在发生错误时遭受内存泄漏。 DLL是围绕其他非托管DLL的托管包装器。

当前解决方案

在一种情况下,我已经通过将调用包装到专用控制台应用程序中的一个DLL并通过Process.Start()调用该应用程序来缓解此问题。 如果该操作失败,并且存在内存泄漏或未释放的文件句柄,则实际上并不重要。 该过程将结束,操作系统将恢复该句柄。

我想将相同的逻辑应用于应用程序中使用这些DLL的其他位置。 但是,对于在解决方案中添加更多控制台项目,以及编写更多调用Process.Start()并解析控制台应用程序输出的样板代码,我并不感到兴奋。

新解决方案

专用控制台应用程序和Process.Start()的绝佳替代方法似乎是使用AppDomain,例如:[http://blogs.geekdojo.net/richard/archive/2003/12/10/428.aspx。]

我已经在我的应用程序中实现了类似的代码,但是单元测试并不令人满意。 我在单独的AppDomain中为测试文件创建一个FileStream,但不要对其进行处理。 然后,我尝试在主域中创建另一个FileStream,由于未释放的文件锁,它失败了。

有趣的是,将一个空的DomainUnload事件添加到工作域使单元测试通过。 无论如何,我担心也许创建“ worker” AppDomains无法解决我的问题。

有什么想法吗?

代码

/// <summary>
/// Executes a method in a separate AppDomain.  This should serve as a simple replacement
/// of running code in a separate process via a console app.
/// </summary>
public T RunInAppDomain<T>( Func<T> func )
{
    AppDomain domain = AppDomain.CreateDomain ( "Delegate Executor " + func.GetHashCode (), null,
        new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory } );

    domain.DomainUnload += ( sender, e ) =>
    {
        // this empty event handler fixes the unit test, but I don't know why
    };

    try
    {
        domain.DoCallBack ( new AppDomainDelegateWrapper ( domain, func ).Invoke );

        return (T)domain.GetData ( "result" );
    }
    finally
    {
        AppDomain.Unload ( domain );
    }
}

public void RunInAppDomain( Action func )
{
    RunInAppDomain ( () => { func (); return 0; } );
}

/// <summary>
/// Provides a serializable wrapper around a delegate.
/// </summary>
[Serializable]
private class AppDomainDelegateWrapper : MarshalByRefObject
{
    private readonly AppDomain _domain;
    private readonly Delegate _delegate;

    public AppDomainDelegateWrapper( AppDomain domain, Delegate func )
    {
        _domain = domain;
        _delegate = func;
    }

    public void Invoke()
    {
        _domain.SetData ( "result", _delegate.DynamicInvoke () );
    }
}

单元测试

[Test]
public void RunInAppDomainCleanupCheck()
{
    const string path = @"../../Output/appdomain-hanging-file.txt";

    using( var file = File.CreateText ( path ) )
    {
        file.WriteLine( "test" );
    }

    // verify that file handles that aren't closed in an AppDomain-wrapped call are cleaned up after the call returns
    Portal.ProcessService.RunInAppDomain ( () =>
    {
        // open a test file, but don't release it.  The handle should be released when the AppDomain is unloaded
        new FileStream ( path, FileMode.Open, FileAccess.ReadWrite, FileShare.None );
    } );

    // sleeping for a while doesn't make a difference
    //Thread.Sleep ( 10000 );

    // creating a new FileStream will fail if the DomainUnload event is not bound
    using( var file = new FileStream ( path, FileMode.Open, FileAccess.ReadWrite, FileShare.None ) )
    {
    }
}
trans by 2020-02-10T00:19:36Z

appdomain-Facebook应用程序创建应用程序域

我正在尝试创建Facebook应用。但是创建向导完成他的工作后,我遇到了麻烦。

在创建的向导中进行任何更改都没有错误:

Error
You have specified an App Domain but have not specified a valid integration URL.
secure-citadel-xxxx.herokuapp.com must be derived from one of: Site URL, Mobile
Site URL, Canvas URL, Secure Canvas URL, Page Tab URL or Secure Page Tab URL.

我在Google上搜索了一下,但找不到答案。

添加http://等等并没有使域无效的其他错误更多。

有人知道如何处理吗?

trans by 2020-02-06T00:29:41Z

iis-如何保持AppDomain中的ASP.NET程序集有效?

方案:我已经使用Web部署项目部署了一个n层企业ASP.NET应用程序。 所有层都产生独立的程序集,这些程序集由ASP.NET应用程序使用。

问题:运行应用程序时。 部署后的第一次,需要花费大量时间将相关程序集加载到内存中。 但是一旦加载了它的照明快速应用程序。 如果没有用户访问该应用程序,则IIS会从内存中卸载程序集,当用户尝试在以后的实例上访问该应用程序时,它将继续加载所有程序集,而再次花费与该程序集相同的加载时间 第一次这样做。

我正在寻找一种解决方案,该解决方案使我能够将程序集持久地加载到内存中,从而覆盖程序集对内存驻留的易变性。

或任何其他可让我的用户愉快地使用该应用程序解决上述问题的解决方案。

trans by 2020-01-27T23:43:05Z

AppDomain和MarshalByRefObject的生存时间:如何避免RemotingException?

当将MarshalByRef对象从AppDomain(1)传递给另一个(2)时,如果在第二个AppDomain(2)中对其调用方法之前等待6分钟,则会得到RemotingException:

System.Runtime.Remoting.RemotingException:   对象已断开连接或   在服务器上不存在。

有关此问题的一些文档:

  • [http://blogs.microsoft.co.il/blogs/sasha/archive/2008/07/19/appdomains-and-remoting-life-time-service.aspx]
  • [http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx]-实例生存期,cbrumme说“我们应该解决此问题”。 :(

如果我错了,请纠正我:如果InitializeLifetimeService返回null,则仅当卸载AppDomain 2时,才可以在AppDomain 1中收集对象,即使已收集代理?

有没有办法禁用生存时间并保持代理(在AppDomain 2中)和对象(在AppDomain1中)处于活动状态,直到代理完成为止? 也许与ISponsor ...?

trans by 2019-11-14T17:55:48Z

.net-列出正在处理的AppDomain

是否有可能在流程中枚举AppDomain?

trans by 2019-11-13T04:18:54Z

.net - 我不懂Application Domain

.NET有这个应用域的概念,根据我的理解,它可用于将程序集加载到内存中。 我已经对应用程序域做了一些研究,并且去了我当地的书店,了解有关这个主题的一些额外知识,但它似乎非常稀少。

我所知道的我可以使用Application Domains来加载内存中的程序集,我可以在需要时卸载它们。

我提到的应用程序域的其他功能有哪些? 线程是否尊重应用程序域边界? 除了主要的应用程序域之外,在除了通信性能之外的不同应用程序域中加载程序集有什么缺点吗?

链接到讨论应用程序域的资源也很不错。 我已经检查过MSDN,它没有那么多关于它们的信息。

trans by 2019-09-20T05:40:58Z

c# - 如何以递归方式将所有引用加载到AppDomain的程序集?

我想加载到一个新的FileNotFoundException一些具有复杂引用树的程序集(MyDll.dll - &gt; Microsoft.Office.Interop.Excel.dll - &gt; Microsoft.Vbe.Interop.dll - &gt; Office.dll - &gt ; stdole.dll)

据我所知,当一个程序集被加载到FileNotFoundException时,它的引用将不会自动加载,我必须手动加载它们。所以当我这样做时:

string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory
string path = System.IO.Path.Combine(dir, "MyDll.dll");

AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = dir;
AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);

domain.Load(AssemblyName.GetAssemblyName(path));

并得到FileNotFoundException

无法加载文件或程序集“MyDll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。 该系统找不到指定的文件。

我认为关键部分是其依赖性之一。

好的,我在FileNotFoundException之前做了下一个

foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
{
    domain.Load(refAsmName);
}

但是在另一个(引用的)程序集上又得到了FileNotFoundException

如何递归加载所有引用?

在加载根程序集之前是否必须创建引用树? 如何在不加载程序集的情况下获取程序集的引用?

trans by 2019-07-18T10:35:04Z

c# - 如何可靠地确定在设计时使用var声明的变量的类型?

我正在为emacs中的C#完成(intellisense)工具。

这个想法是,如果用户键入片段,然后通过特定的击键组合要求完成,则完成工具将使用.NET反射来确定可能的完成。

这样做需要知道正在完成的事物的类型。 如果它是一个字符串,则有一组已知的可能方法和属性; 如果它是一个Int32,它有一个单独的集,依此类推。

使用语义,emacs中提供的代码词法分析器/解析器包,我可以找到变量声明及其类型。 鉴于此,可以直接使用反射来获取类型上的方法和属性,然后向用户显示选项列表。 (好吧,在emacs中做的不是那么简单,但是使用在emacs中运行PowerShell进程的能力,它变得容易得多。我编写一个自定义.NET程序集来进行反射,将其加载到powershell中,然后运行elisp emacs可以通过comint向powershell发送命令并读取响应。因此,emacs可以快速获得反射结果。)

当代码在正在完成的事物的声明中使用var时,问题就到了。 这意味着未明确指定类型,并且完成将不起作用。

当使用var关键字声明变量时,如何可靠地确定实际使用的类型? 为了清楚起见,我不需要在运行时确定它。 我想在“设计时”确定它。

到目前为止,我有这些想法:

  1. 编译并调用:
    • 提取声明语句,例如`var foo =“一个字符串值”;`
    • 连接语句`foo.GetType();`
    • 将生成的C#片段动态编译为新的程序集
    • 将程序集加载到新的AppDomain中,运行该片段并获取返回类型。
    • 卸载并丢弃组件

    我知道怎么做这一切。 但对于编辑器中的每个完成请求,它听起来非常重量级。

    我想我每次都不需要新的AppDomain。 我可以为单个AppDomain重复使用多个临时程序集,并分摊设置它的成本跨越多个完成请求并将其拆除。 这更像是对基本理念的调整。

  2. 编译和检查IL

    只需将声明编译到模块中,然后检查IL,以确定编译器推断出的实际类型。 这怎么可能? 我会用什么来检查IL?

还有更好的想法吗? 评论?建议?


编辑 - 进一步考虑这一点,编译和调用是不可接受的,因为调用可能有副作用。 因此必须排除第一种选择。

此外,我认为我不能假设.NET 4.0的存在。


更新 - 上面没有提到的正确答案,但Eric Lippert温和地指出,是实现完全保真的类型推理系统。 它是在设计时可靠地确定var类型的唯一方法。 但是,这也不容易。 因为我没有想要尝试构建这样的东西的幻想,我采取了选项2的快捷方式 - 提取相关的声明代码,并编译它,然后检查生成的IL。

这实际上适用于完成方案的公平子集。

例如,假设在下面的代码片段中,? 是用户要求完成的位置。 这有效:

var x = "hello there"; 
x.?

完成意识到x是一个String,并提供适当的选项。 它通过生成并编译以下源代码来实现:

namespace N1 {
  static class dmriiann5he { // randomly-generated class name
    static void M1 () {
       var x = "hello there"; 
    }
  }
}

......然后用简单的反射检查IL。

这也有效:

var x = new XmlDocument();
x.? 

引擎将相应的using子句添加到生成的源代码中,以便正确编译,然后IL检查是相同的。

这也有效:

var x = "hello"; 
var y = x.ToCharArray();    
var z = y.?

它只是意味着IL检查必须找到第三个局部变量的类型,而不是第一个。

还有这个:

var foo = "Tra la la";
var fred = new System.Collections.Generic.List<String>
    {
        foo,
        foo.Length.ToString()
    };
var z = fred.Count;
var x = z.?

......比前面的例子更深一层。

但是,什么不起作用是完成任何局部变量,其初始化取决于实例成员或本地方法参数的任何点。 喜欢:

var foo = this.InstanceMethod();
foo.?

也不是LINQ语法。

在我考虑通过什么绝对是“有限的设计”(黑客的礼貌用语)来完成它之前,我将不得不考虑这些东西是多么有价值。

解决依赖于方法参数或实例方法的问题的方法是在生成,编译然后进行IL分析的代码片段中替换对具有相同类型的“合成”本地变量的那些事物的引用。


另一个更新 - 依赖于实例成员的vars完成,现在可以正常工作。

我所做的是询问类型(通过语义),然后为所有现有成员生成合成替代成员。 对于像这样的C#缓冲区:

public class CsharpCompletion
{
    private static int PrivateStaticField1 = 17;

    string InstanceMethod1(int index)
    {
        ...lots of code here...
        return result;
    }

    public void Run(int count)
    {
        var foo = "this is a string";
        var fred = new System.Collections.Generic.List<String>
        {
            foo,
            foo.Length.ToString()
        };
        var z = fred.Count;
        var mmm = count + z + CsharpCompletion.PrivateStaticField1;
        var nnn = this.InstanceMethod1(mmm);
        var fff = nnn.?

        ...more code here...

...生成的代码被编译,以便我可以从输出IL中学习本地var nnn的类型,如下所示:

namespace Nsbwhi0rdami {
  class CsharpCompletion {
    private static int PrivateStaticField1 = default(int);
    string InstanceMethod1(int index) { return default(string); }

    void M0zpstti30f4 (int count) {
       var foo = "this is a string";
       var fred = new System.Collections.Generic.List<String> { foo, foo.Length.ToString() };
       var z = fred.Count;
       var mmm = count + z + CsharpCompletion.PrivateStaticField1;
       var nnn = this.InstanceMethod1(mmm);
      }
  }
}

骨架代码中提供了所有实例和静态类型成员。 它编译成功。 此时,通过Reflection可以直接确定局部变量的类型。

使这成为可能的是:

  • 能够在emacs中运行powershell
  • C#编译器非常快。 在我的机器上,编译内存中的程序集大约需要0.5秒。 对键击之间的分析速度不够快,但足够快以支持按需生成完成列表。

我还没有看过LINQ。
这将是一个更大的问题,因为语义词法分析器/解析器emacs具有C#,不“做”LINQ。

trans by 2019-07-14T15:41:06Z

远程处理 - 在C#中使用AppDomain

App #mains在C#中最重要的用途是什么?

trans by 2019-06-17T11:53:57Z

appdomain - 什么是.NET应用程序域?

特别是,在两个不同的应用程序域中运行代码的含义是什么?

数据如何通过应用程序域边界传递? 是否与跨过程边界传递数据相同? 我很想知道更多有关这种抽象及其有用的内容。

编辑:一般来说AppDomain类的现有覆盖范围很好,我不了解应用程序域

trans by 2019-05-12T00:53:38Z

.net - 我不懂Application Domain

.NET有这个应用域的概念,根据我的理解,它可用于将程序集加载到内存中。 我已经对应用程序域做了一些研究,并且去了我当地的书店,了解了这个主题的一些额外知识,但它似乎非常稀少。

我所知道的我可以使用Application Domains来加载内存中的程序集,我可以在需要时卸载它们。

我提到的应用程序域的其他功能有哪些? 线程是否尊重应用程序域边界? 除了主要的应用程序域之外,在除了通信性能之外的不同应用程序域中加载程序集有什么缺点吗?

链接到讨论应用程序域的资源也很不错。 我已经检查过MSDN,它没有那么多关于它们的信息。

trans by 2019-04-09T07:36:29Z

1 共1页