System.Runtime.Remoting.RemotingException调用外部程序集

时间:2017-08-21 14:14:07

标签: c# reflection remoting

我第一次玩反射和遥控。我在机器上有一个程序集,我对源代码的只读访问权限,我想直接调用它的一个方法。这是我的代码:

        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>

0 个答案:

没有答案