0

ソリューションで使用されるアセンブリのコードをコピーして、同様のアセンブリを作成しました。GUTS は異なっていましたが、シェルは同じままでした。

これらのアセンブリは、アドオンであり、コア コードの一部ではないクライアントのプロジェクトで使用されます。完成したので、アセンブリは想定どおりにロードしたくありません。

アセンブリをロードするコードは

var assemblyName = ((XmlElement)xmlDoc.GetElementsByTagName("AssemblyName")[0]).InnerText;
var qualifiedClass = ((XmlElement)xmlDoc.GetElementsByTagName("QualifiedClass")[0]).InnerText;

IExternalAddOn addOn = (IExternalAddOn)Activator.CreateInstance(assemblyName, qualifiedClass).Unwrap();
var properties = new Dictionary<Type, object>();
properties[typeof(DevExpress.XtraBars.Ribbon.RibbonControl)] = mainForm.ribbon;
var form = addOn.ShowForm(properties);
if (form != null)
{
form.MdiParent = mainForm;
form.Text = pListRow.NAME;
form.Show();

CreateInstance 部分で例外が発生します。

興味深いのは、私が使用するとき

Assembly ass = Assembly.LoadFrom(assemblyName); // this is test code
Type at = ass.GetType(qualifiedClass);
IExternalAddOn addOn = (IExternalAddOn)Activator.CreateInstance(at);

アセンブリをロードして型を取得すると、CreateInstance が機能します。

アンラップが必要な理由 2 つの異なる読み込み方法に違いはありますか? そして、なぜ最初のものは機能しないのですか?

ありがとう

J

4

1 に答える 1

2

動作するとすぐに、ファイル名をパラメーターAssembly.LoadFromとして渡していると思いますが、 .assemblyNameActivator.CreateInstance(assemblyName, qualifiedClass)

Activator.CreateInstanceドキュメントによると:

assemblyName は次のいずれかです。

  • パスまたはファイル拡張子を含まない、アセンブリの単純な名前。たとえば、パスと名前が .\bin\TypeExtensions.dll のアセンブリに TypeExtensions を指定します。

  • 署名されたアセンブリの完全な名前。単純な名前、バージョン、カルチャ、および公開キー トークンで構成されます。たとえば、「TypeExtensions、Version=1.0.0.0、Culture=neutral、PublicKeyToken=181869f2f7435b51」などです。

于 2014-07-03T09:41:21.097 に答える