프로젝트에서 기존 100개 이상의 DLL 3을 호출하여 단일 유형의 도메인 간 문제 해결
15173 단어 dll
///
<summary>
///
really business operation.
///
</summary>
[Serializable]
public
class
ServiceWrapper1 : MarshalByRefObject
{
protected
ServiceWrapper1()
{
}
public
virtual
List
<
OpaOutput
>
GetUserDto(OpaInput input)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName
+
"
Test2
"
);
//
show current domain
OPATest test
=
new
OPATest();
return
test.GetUserDto(input);
}
}
}
이것은 간단한 wrap으로 다른 dll의OPAtest 클래스를 호출하는 데 사용되며, 코드가 독립된 영역에서 실행되는지 테스트합니다
구조 함수가Protected로 변하는 주요 원인은 구조 함수를 통해 wrap 실례를 직접 만드는 것을 금지하고,DefaultInstance를 통해 코드를 호출하도록 강요하기 때문이다. (이것이야말로 응용 프로그램의 격리이다)
Private가 되지 않는 이유는 나중에 계승이 필요하기 때문입니다. 부류의 구조 함수를private로 설정하면 부류도 구성할 수 없습니다.
그러나 현재 코드에서 보호된 코드를 퍼블릭으로 바꿔야 정상적으로 실행할 수 있습니다.
도메인 간 문제를 해결하기 위해 Wrap 클래스를 MarshalByRefObject에 상속합니다.
OpaInput과 OpaOutput은 각각 입력 출력 매개 변수(기존 dll에서 개발을 편리하게 하기 위해 일시적으로 서열화할 수 있고 진정한 서열화가 실현되는 문제는 잠시 후에 해결됨) 다음은 그들의 정의이다.
namespace
ClassLibrary2
{
public
class
OPATest
{
public
List
<
OpaOutput
>
GetUserDto(OpaInput input)
{
return
new
List
<
OpaOutput
>
{
new
OpaOutput() { Date
=
DateTime.Now },
new
OpaOutput(){Date
=
DateTime.Now},
new
OpaOutput(){Date
=
DateTime.Now},
};
}
}
[Serializable]
public
class
OpaOutput
{
public
string
Name {
get
;
set
; }
public
string
Content;
public
int
Type;
public
DateTime Date {
get
;
set
; }
}
[Serializable]
public
class
OpaInput
{
public
string
UserCode {
get
;
set
; }
public
string
Content;
public
int
?
Type;
public
DateTime StartDate {
get
;
set
; }
public
DateTime EndDate {
get
;
set
; }
}
}
전역에 쉽게 접근할 수 있는 dll은 다음과 같은 유형을 실현했다
[Serializable]
public
class
BaseWrapper
<
T
>
: MarshalByRefObject
{
///
<summary>
///
define a application domain for every T
///
</summary>
private
static
AppDomain _CurrentDomian
=
null
;
///
<summary>
///
static constructor
///
</summary>
static
BaseWrapper()
{
string
domainName
=
"
Application Execution Domain
"
+
typeof
(T).FullName;
_CurrentDomian
=
AppDomain.CreateDomain(domainName,
null
,
null
);
}
///
<summary>
///
forbid call constructor directly.
///
</summary>
protected
BaseWrapper()
{
}
///
<summary>
///
singleton instance.
///
</summary>
public
static
T DefaultInstance
{
get
{
return
(T)_CurrentDomian.CreateInstanceAndUnwrap(
typeof
(T).Assembly.FullName,
typeof
(T).FullName);
}
}
}
그러면 크로스 도메인 호출은 매우 간단하고, 하나의 유형 T에 대한 Application Domain을 유지합니다.
호출 코드는 다음과 같습니다.
BaseWrapper
<
ServiceWrapper1
>
.DefaultInstance.GetUserDto(
new
ClassLibrary2.OpaInput() { Content
=
"
123
"
});
매우 간단하다. 원래의 호출 코드에 비해 증가한 코드량은 조금도 많지 않다. 원래의 호출 코드는 다음과 같다.
ServiceWrapper1 s
=
new
ServiceWrapper1();
s.GetUserDto(
new
ClassLibrary2.OpaInput() { Content
=
"
123
"
});
최종 실행 결과는 다음과 같습니다.
Application Execution Domain ClassLibrary1.ServiceWrapper1 Test2
이 방법은 새로운 응용 프로그램 영역에서 실행된다는 것을 설명합니다
PS: 입력과 출력을 서열화하는 가설을 만들었습니다. 사실 모든 사람들이 코드를 설명할 때 서열화 탭을 붙이는 것은 아닙니다. 잠시 후에 저희가 이 문제를 해결하겠습니다.
그러면 지금까지 외부 dll을 호출한 모든 코드를 분류에 집중하고 서로 다른 응용 프로그램 영역에서 격리하여 실행했습니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.