안녕하세요.
C# (4.6.1) Assembly에 관한 질문입니다.
저는 외부에 있는(상속받은) 어셈블리가 필요합니다.
Assembly.LoadFile(".dll")
방식으로 어셈블리를 찾을 수도 있지만
외부 시점에서 Assembly를 생성하고 있습니다.
// Service.dll
public Service : Base
{
// Base에서 사용할 수 있도록 생성.
public override Assembly Assem => Assembly.GetExecutingAssembly();
}
그래서,
외부에서 생성한 assembly에 접근하여 사용하고 있습니다.
// Base.dll
public class Base
{
public virtual Assembly Assem => null;
public Base()
{
// 외부 dll에서 생성된 assembly 사용.
Stream stream = Assem.GetManifestResourceStream("<queryfile.yaml>");
}
}
<요약>
- 상속 관계를 통해 외부 Assembly를 찾을 수도 있을까요?
읽어주셔서 감사합니다.
처음 작성한 질문 (누르면 펼쳐짐)
제가 외부 Assembly 객체 정보를 받기 위한 로직을 구현하고 있는데요.
최소한으로 필요한 부분만 샘플로 작성했습니다.
내용은 하단 DataSerialize.dll 부분에서 Proxy.dll의 Assembly를 가져오고 싶은데요.
이유는 Proxy.dll 안에 포함 리소스로 포함된 .yaml
파일을 읽어들이기 위함입니다.
일단 정상 동작하는 것을 빨리 보고 싶어서
아래와 같이 override
를 통해 Assembly에 접근할 수 있도록 구현은 했는데요.
이런 비슷한 상황에서 어떻게 하는 것이 좋은지 알고 싶습니다.
그리고 SelectProxy 같은 클래스가 수십 수백개일 때에는 또 불편할 것 같은데요.
(어셈블리를 위한 클래스를 또 만들어보기도 하고…)
암튼 저는 이런 상황이 자주 생겨서 지금까지는 크게 중요하지 않다 생각하고,
아래처럼 대충 넘어갔는데요.
이런 상황에서는 어떻게 하면 좋을지 소중한 조언 부탁드립니다!!
<내용 요약>
- 아래는 정상 동작하는 샘플 소스코드 입니다.
- Assembly를 Override를 통해 재정의 해서 접근하는 것이 올바른지?
- Assembly를 가져오는 다른 방법?
- 구조 문제?
- Assembly 이해, 사용에 대해 잘못 생각하고 있는지?
- 애초에 잘못된 질문인지…
Proxy.dll
// Assembly Proxy.dll
public class SelectProxy : ProxyBase
{
protected override string QueryName => "namespace.folder.filename.yaml";
protected override Assembly OnLoadAssembly() =>
Assembly.GetExecutingAssembly();
}
ProxyBase.dll
// Assembly ProxyBase.dll
public class ProxyBase
{
public abstract string QueryName { get };
public override Assembly OnLoadAssembly()
{
return Assembly.GetExecutingAssembly();
}
public void Read(Assembly assembly)
{
var source = Read<DataModel>(QueryName, OnLoadAssembly());
this.Execute(source);
}
}
DataSerialize.dll
// Assembly DataSerialize.dll
public class YamlProvider
{
publicoverride Read<T>(string resName, Assembly assem)
{
using (Stream stream = assem.GetManifestResourceStream(resName))
using (StreamReader reader = new StreamReader(stream))
{
var deserializer = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.Build();
return deserializer.Deserialize<T>(reader.ReadToEnd());
}
}
}