我第一次玩反射和遥控。我在机器上有一个程序集,我对源代码的只读访问权限,我想直接调用它的一个方法。这是我的代码:
AppDomain NewDomain = AppDomain.CreateDomain("NewDomain");
try
{
var objectHandle = NewDomain.CreateInstanceFrom(@"C:\Program Files (x86)\xxx\ExistingAssembly.dll", "RemoteNamespace.RemoteClass");
var localObject = (RemoteNamespace.ISharedInterface)objectHandle.Unwrap();
File.Copy(localObject.StrTargetMethod(arg1),
Path.Combine(logDir, logfile), true);
}
finally
{
AppDomain.Unload(NewDomain);
}
在try
块的第一行,CreateInstanceFrom
方法会抛出UnhandledException: System.Runtime.Remoting.RemotingException: Cannot load type 'RemoteNamespace.RemoteClass, RemoteNamespace, Version=1.2.0.8, Culture=neutral, PublicKeyToken=xxxxxxxxxx'
。
var assembly = Assembly.LoadFrom(@"C:\Program Files (x86)\xxx\ExistingAssembly.dll");
var localObject = (ISharedInterface)assembly.CreateInstance("RemoteNamespace.RemoteClass");
但是我在assembly.CreateInstance()
处遇到同样的错误。我将assembly.GetTypes()
记录到屏幕上,因此我知道程序集正确加载,并且我之后的类别在打印列表中。
编辑2:使用Activator.CreateInstance(assembly.FullName, "RemoteNamespace.RemoteClass")
工作后,我将程序集位置添加为App.config中的<dependentAssembly>
块。我不知道assembly.CreateInstance()
的问题是什么。对于遇到此问题的任何其他人的参考,App.config中所需的XML是:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="[AssemblyNameWithoutFileExtension]" publicKeyToken="[AssemblyPublicKeyToken]" culture="neutral" />
<codeBase version="[AssemblyVersionNumber]" href="file:///[FullAssemblyFilePath]" />
</dependentAssembly>
</assemblyBinding>
</runtime>