나는 (이전에 작동하고 있던) 어떤 이유로 인해 CreateInstanceAndUnwrap에 문제가 있습니다.다른 도메인에서 CreateInstanceAndUnwrap을 만드시겠습니까?
내가 동적으로 몇 가지 코드를 생성하며 MEF를 통해 하위 디렉토리에서 DLL의로드 :
내 프로세스는이입니다. 그런 다음 이러한 응용 프로그램은 해당 DLL에서 다른 요구 사항을로드합니다. 호출 어셈블리의 경로가 포함 된 AppDomainSetup을 포함하도록 코드를 업데이트해야했습니다.
새로운 AppDomain을 올바르게 만듭니다. 문제는 없습니다. 나는이 코드를 실행하려고하면 :
object runtime = domain.CreateInstanceAndUnwrap(
typeof(CrossDomainApplication).Assembly.FullName,
typeof(CrossDomainApplication).FullName);
을 나는 거대한 문제가 없다 - 런타임 (위의 변수가) 더 이상 CrossDomainApplication 또는 ICrossDomainApplication으로 캐스팅 할 수 있습니다.
public class CrossDomainApplication : MarshalByRefObject, ICrossDomainApplication
그리고 인터페이스는 다음과 같습니다 :
public interface ICrossDomainApplication
{
void Run(CrossDomainApplicationParameters parameters);
}
그리고 매개 변수의 모양 :
이[Serializable]
public class CrossDomainApplicationParameters : MarshalByRefObject
{
public object FactoryType { get; set; }
public Type ApplicationType { get; set; }
public string ModuleName { get; set; }
public object[] Parameters { get; set; }
}
런타임의 기본 형태가 나타납니다
실제 목적은 같다 MarshalByRefObject가되어야하며 다른 것으로 변환하는 것을 좋아하지 않습니다.
무엇이 잘못 될 수 있는지에 대한 의견이 있으십니까?
편집 :
ICrossDomainApplication runtime = (ICrossDomainApplication)domain.CreateInstanceAndUnwrap(
typeof(CrossDomainApplication).Assembly.FullName,
typeof(CrossDomainApplication).FullName);
//Exception before reaching here
runtime.Run(parameters);
System.InvalidCastException : 'Infrastructure.ICrossDomainApplication'을 입력 할 투명 프록시를 캐스팅 할 수 없습니다를 여기에 내가 다음으로 실행할 때 내가 오류입니다. 여기
도메인 내가 그것을 만들 때, 어떻게 표시되는지를 보여줍니다 : AppDomain domain = AppDomain.CreateDomain(
Guid.NewGuid().ToString(),
null,
new AppDomainSetup()
{
ApplicationBase = GetPath(),
ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,
ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
LoaderOptimization = LoaderOptimization.MultiDomainHost
});
및 GetPath()는 다음과 같습니다
private string GetPath()
{
Uri path = new Uri(Assembly.GetCallingAssembly().CodeBase);
if (path.IsFile)
{
path = new Uri(path, Path.GetDirectoryName(path.AbsolutePath));
}
return path.LocalPath.Replace("%20", " ");
}
어셈블리를 찾지 못하는 CLR만큼 간단 할 수 있습니다. * 정확한 * 예외를 문서화하는 것을 건너 뛰지 마십시오. –
예외를 얻는 것 같지 않습니다. 이상적인 경우를 제외하고는 원하는 유형으로 캐스트했습니다. 또한 새로운 도메인뿐만 아니라 AppDomain.Current에서 이벤트 콜백을 기록하기 위해 핸들러를 첨부했습니다. 내가 그것을 빨리 던지려고하지 않는다면 어떤 예외 나 콜백도 없다. – Locke
이것은 플러그인에서 자주 발생하는 문제입니다. ICrossDomainApplication에 대해 ** 두 가지 ** 정의가 있습니다. 그들은 다른 어셈블리에서 왔습니다. 어셈블리를 복사했거나 소스 코드를 두 번 포함했기 때문입니다. CLR에서는이를 별도의 호환되지 않는 형식으로 처리합니다. 하나의 ICrossDomainApplication을 가진 정확히 동일한 어셈블리가 두 appdomain에 모두로드되도록해야합니다. –