小编gf1*_*072的帖子

如何动态引用查找另一个程序集的程序集?

为这个狡猾的问题道歉 - 如果有人有更好的建议,我很乐意改写.

我正在尝试通过动态调用属于另一个应用程序的程序集来创建一个对象.

以下PowerShell代码对我很有用:

[Reflection.Assembly]::LoadFrom("C:\Program Files\Vendor\Product\ProductAPI.dll")
$bobject = new-object ProductAPI.BasicObject    
$bobject.AddName("Some Name") 
Run Code Online (Sandbox Code Playgroud)

我在C#中努力做同样的事情.根据StackOverflow上的其他帖子,我目前有这个:

System.Reflection.Assembly myDllAssembly =
System.Reflection.Assembly.LoadFile("C:\\Program Files\\Vendor\\Product\\ProductAPI.dll");

System.Type BasicObjectType = myDllAssembly.GetType("ProductAPI.BasicObject");

var basicObjectInstance = Activator.CreateInstance(BasicObjectType);
Run Code Online (Sandbox Code Playgroud)

最后一行导致TargetInvocationException.

{"无法加载文件或程序集'AnotherObject,Version = 1.2.345.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.系统找不到指定的文件."

看起来BasicObject构造函数试图调用AnotherObject(来自同一文件夹中的AnotherObject.dll)但找不到它.

关于如何解决这个问题的任何提示?

c# reflection powershell assembly-resolution

6
推荐指数
1
解决办法
1759
查看次数

我应该如何序列化包含大量对象的对象?

我正在使用c#和.net 4.5.

我有一个SomeData类,它包含一个成员_SomeEvents,它是一个Dictionary.SomeData类还包含一堆信息,例如生成数据的时间,生成数据的用户等.

我正在尝试使用formatter.Serialize将SomeData对象保存到文件,但是当对象很大时会遇到OutOfMemoryException(例如1GB)

IFormatter formatter = new BinaryFormatter();
Stream stream;
stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, _myObject);
stream.Close();
Run Code Online (Sandbox Code Playgroud)

我读过的其他帖子表明,内存不足问题是由于无法找到足够大的连续可用内存区域来生成要写入磁盘的数据.我还读到这是序列化的"错误"方式 - 我的假设是,如果我正确地执行它,CLR会在数据发送时写入数据,而不是在保存之前尝试在内存中准备全部数据.也就是说 - 我确实看到在序列化操作失败之前创建了一个大文件,暗示它正在写入.

我已经尝试更改Serialize操作来编写Dictionary对象本身而不是包含Dictionary的对象 - 同样的问题,我得到了内存异常.

问题:

  1. 为什么Serialize会遇到这个内存问题 - 即使我给它一个Dictionary对象来序列化 - 当然它会写入它的内容吗?
  2. 有更好的方法吗?!!

这是完整的例外:

无法保存文件:System.OutOfMemoryException:抛出了类型'System.OutOfMemoryException'的异常.

在System.Runtime.Serialization.ObjectIDGenerator.Rehash()

在System.Runtime.Serialization.ObjectIDGenerator.GetId(Object obj,Boolean&firstTime)

在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.InternalGetId(Object obj,Boolean assignUniqueIdToValueType,Type type,Boolean&isNew)

at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo,NameInfo typeNameInfo,Object stringObject)

在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteKnownValueClass(NameInfo memberNameInfo,NameInfo typeNameInfo,Object data)

在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteMembers(NameInfo memberNameInfo,NameInfo memberTypeNameInfo,Object memberData,WriteObjectInfo objectInfo,NameInfo typeNameInfo,WriteObjectInfo memberObjectInfo)

在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteMemberSetup(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo,String memberName,Type memberType,Object memberData,WriteObjectInfo memberObjectInfo)

at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo,String [] memberNames,Type [] memberTypes,Object [] memberData,WriteObjectInfo …

.net c# clr serialization

6
推荐指数
1
解决办法
1624
查看次数