DeepCloner icon indicating copy to clipboard operation
DeepCloner copied to clipboard

No stable cloning of `System.Drawing.Font` object

Open ghost opened this issue 2 years ago • 6 comments

ghost avatar Jul 07 '22 04:07 ghost

It can be problematic on Windows due use of native handles, which are problematic to clone. When you dispose one object, it closes native handle, so, other object stops to work. And in different classes - different policy for using native resources. I do not found way to make correct work for these types in any situation. May be I'll try to make something with this type. Can you describe, which effects on Font clone occur?

force-net avatar Jul 12 '22 11:07 force-net

The solution is to identify the type and re-new a new object. It would solve away most of the problem, I'm not familiar with whether DeepCloner has a special tool to handle this. So if my class involves related objects, I would consider writing deep copies and using DeepCloner for other objects to solve it.

ghost avatar Jul 20 '22 09:07 ghost

I'm having a similar problem cloning an Exception that includes an IntPtr in the TargetSite property. Is it possible to have DeepCloner ignore certain properties in Exception such as TargetSite?

ian-g-holm-intel avatar Nov 02 '22 22:11 ian-g-holm-intel

Every IntPtr is a problem. In dotnet it simply native int (long/int depends on architecture). But it points to some unmanaged resource. And when we clone object - two object begun to own this resource and use it. But they do no not know about each other and can release it or do something other that will cause an error. If DeepCloner will not copy IntPtr (e.g. set it to 0) - second object can throw NullPointerException but in some native way. Some handles can be safely cloned, but other is impossible for this operation. As result, it is very serious problem, and I do not know, what I can do with this globally.

force-net avatar Nov 03 '22 07:11 force-net

But an IntPtr is simply a struct that points to that address. So isn't cloning the IntPtr as simple as creating a new IntPtr that points to the same address? The question of "what" is at that address shouldn't be relevant to the cloning process.

ian-g-holm-intel avatar Nov 03 '22 17:11 ian-g-holm-intel

Intptr is just a pointer, essentially just a nint. You only need to copy its value to the new nint/IntPtr structure like nint.

sgf avatar Dec 06 '23 03:12 sgf