2012-04-27 6 views
1

웹 사이트에서 작동하지 않습니다 - 나는 이것은 콘솔 응용 프로그램에서 잘 작동 그래서AppDomain.CreateInstanceAndUnwrap 내가 아주 간단한 클래스 CompiledFunction (MarshalByRefObject에서)가

var appDomainSetup = new AppDomainSetup(); 
appDomainSetup.ApplicationBase = Path.GetDirectoryName(typeof(CompilerService).Assembly.CodeBase); 
var evidence = AppDomain.CurrentDomain.Evidence; 
SandboxDomain = AppDomain.CreateDomain("Sandbox", evidence, appDomainSetup); 

CompiledFunction<T> result = (CompiledFunction<T>)SandboxDomain.CreateInstanceAndUnwrap(
    assemblyName: typeof(CompiledFunction<T>).Assembly.GetName().Name, 
    typeName: typeof(CompiledFunction<T>).FullName); 

같은 새 도메인이의 인스턴스를 만들려고 ,하지만 ASP .NET MVC 응용 프로그램에서 다음과 같은 예외가 발생합니다 - 왜이 웹 응용 프로그램에서 작동하지 않는지에 대한 제안을 제공 할 수 있습니까? 내가 지나가는 오전 T 매개 변수는 제대로 새 도메인의 웹 프로젝트를위한 어셈블리 또는 설정 잘못 ApplicationBase를 Ems.Scripting (가능성)을 복사하지 않았다처럼

System.IO.FileLoadException was caught 
    Message=The given assembly name or codebase, 'Ems.Scripting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', was invalid. 
    Source=mscorlib 
    FileName=Ems.Scripting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
    FusionLog==== Pre-bind state information === 
LOG: User = EMSLaptop\PeterMorris 
LOG: DisplayName = Ems.Scripting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
(Fully-specified) 
LOG: Appbase = /C:/Users/PeterMorris/Documents/Visual Studio 2010/Projects/MvcApplication26/MvcApplication26/bin 
LOG: Initial PrivatePath = NULL 
Calling assembly : (Unknown). 
=== 
LOG: This bind starts in default load context. 
LOG: Found application configuration file (C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exe.Config). 
LOG: Using application configuration file: C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL /C:/Users/PeterMorris/Documents/Visual Studio 2010/Projects/MvcApplication26/MvcApplication26/bin/Ems.Scripting.DLL. 

    StackTrace: 
     at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
     at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
     at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
     at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 
     at System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark) 
     at System.Activator.CreateInstance(String assemblyName, String typeName) 
     at System.AppDomain.CreateInstance(String assemblyName, String typeName) 
     at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName) 
     at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName) 
     at Ems.Scripting.CompilerService.Compile[T](String[] scripts, Dictionary`2 variableDefinitions, IEnumerable`1 referencedAssemblies, ICompiledFunction`1& function, IEnumerable`1& compilerErrors) in C:\Data\EMS\Lib\Ems.Scripting\CompilerService.cs:line 43 
    InnerException: 

답변

2

문제는 Assembly.Code베이스가 file : /// {나머지 경로}로 시작되었습니다. Path.GetDirectoryName을 이러한 경로에 사용하면 file : ///을 단일 슬래시로 바꿉니다. 그래서 당신은 로컬 경로는 경로가 올바른지, 그리고 DLL이 그 경로에

if (SandboxDomain == null) 
{ 
    var appDomainSetup = new AppDomainSetup(); 
    string appBase = typeof(CompilerService).Assembly.CodeBase; 

    //Added the following line 
    appBase = new Uri(appBase).LocalPath; 
    appDomainSetup.ApplicationBase = Path.GetDirectoryName(appBase); 
    var evidence = AppDomain.CurrentDomain.Evidence; 
    SandboxDomain = AppDomain.CreateDomain("Sandbox", evidence, appDomainSetup); 
} 
+1

'CodeBase'가 아닌'Location' 속성을 사용해야합니다. –

0

이 보이는 System.Decimal입니다.

Path.GetDirectoryName 호출은 ApplicationBase 속성을 계산할 때 의심 스럽습니다.

+0

솔루션을이었다 말해 열린 우리당 얻기 "/c:\myfolder\myfile.dll"

와 끝까지. –