Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. I thought .NET was supposed to make things easier, if anything, than unmanaged code.

I thought .NET was supposed to make things easier, if anything, than unmanaged code.

Scheduled Pinned Locked Moved The Lounge
csharpdatabasesql-servercomsysadmin
111 Posts 19 Posters 5 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Z zezba9000

    No you don't have to copy memory if you use a native pointer to a memory mapped file. In C# a pointer like "int*" is the same as a pointer in C/C++. There is no difference. That pointer in C# will directly be pointing to your native memory buffer you allocated from a native Win32 or POSIX API. Pointers in C# can point to literally anything just as they can in C/C++. That includes managed and unmanaged memory locations. For example this psuedo C# code would work:

    [DllImport("nativeLib")]
    static unsafe extern int* CreateNativeMemoryMappedFile();

    unsafe void WriteMemoryMappedFile()
    {
    int* nativeMemory = CreateNativeMemoryMappedFile();
    nativeMemory[0] = 123;// this is writing directly from the native buffer (not a copy)
    if (nativeMemory[1] == 321) return;// this is reading directly from the native buffer (not a copy)
    }

    H Offline
    H Offline
    honey the codewitch
    wrote on last edited by
    #89

    you cannot create objects at that pointer. ergo, no vmem backed objects. you can do pointer ops, but then you're copying object data from the object (on GC heap) to the unmanaged heap. If I do a memcpy, or pointer based assignment in a for loop, either way i'm copying the data. and doing so, even if i did, is really no different than calling (filestream).Write(...) which would be more direct. there is no way around it because of how a GC works. if you think I'm wrong show me how to *create an object* at a specific address in .NET - because that's the only way to back an object with vmem, short of creating a custom CLI host in C(++) or some other unmanaged language and AFAICT would have to back an entire appdomain with vmem for it to work.

    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

    Z 1 Reply Last reply
    0
    • H honey the codewitch

      you cannot create objects at that pointer. ergo, no vmem backed objects. you can do pointer ops, but then you're copying object data from the object (on GC heap) to the unmanaged heap. If I do a memcpy, or pointer based assignment in a for loop, either way i'm copying the data. and doing so, even if i did, is really no different than calling (filestream).Write(...) which would be more direct. there is no way around it because of how a GC works. if you think I'm wrong show me how to *create an object* at a specific address in .NET - because that's the only way to back an object with vmem, short of creating a custom CLI host in C(++) or some other unmanaged language and AFAICT would have to back an entire appdomain with vmem for it to work.

      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

      Z Offline
      Z Offline
      zezba9000
      wrote on last edited by
      #90

      "

      Quote:

      if you think I'm wrong show me how to *create an object* at a specific address in .NET

      Invoke the C method from C# you would use to allocation memory at that specific vmem address. Keep a reference to that address in C# as a pointer as you would in C. No difference from doing it in C. Again if you can address it in C you can address it in C# using pointers. Can you show me what method you're invoking in C that allocates memory at a specific address? Then I can give an example and it would remove the confusion. I can only guess at what methods you're trying to use.

      H 2 Replies Last reply
      0
      • Z zezba9000

        "

        Quote:

        if you think I'm wrong show me how to *create an object* at a specific address in .NET

        Invoke the C method from C# you would use to allocation memory at that specific vmem address. Keep a reference to that address in C# as a pointer as you would in C. No difference from doing it in C. Again if you can address it in C you can address it in C# using pointers. Can you show me what method you're invoking in C that allocates memory at a specific address? Then I can give an example and it would remove the confusion. I can only guess at what methods you're trying to use.

        H Offline
        H Offline
        honey the codewitch
        wrote on last edited by
        #91

        what C method? the method to create the object? that's not a .NET object. I can already do all this mapping in C. There's no point in any of that.

        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

        1 Reply Last reply
        0
        • Z zezba9000

          "

          Quote:

          if you think I'm wrong show me how to *create an object* at a specific address in .NET

          Invoke the C method from C# you would use to allocation memory at that specific vmem address. Keep a reference to that address in C# as a pointer as you would in C. No difference from doing it in C. Again if you can address it in C you can address it in C# using pointers. Can you show me what method you're invoking in C that allocates memory at a specific address? Then I can give an example and it would remove the confusion. I can only guess at what methods you're trying to use.

          H Offline
          H Offline
          honey the codewitch
          wrote on last edited by
          #92

          you do understand that paged memory allows you to do pointer ops directly to a file, i assume? and that normally what you'd do is just create your data structures at that memory mapped address and then use them like normal classes and structure, which are automatically written to disk as they are accessed.

          struct foo {
          int bar;
          };

          foo* pfoo = VirtualAlloc(..., sizeof(foo));
          pfoo->bar=1; // writes to disk
          printf("%d",pfoo->bar); // reads from disk.

          there is simply no way to do that in .NET if you're saying there is show me how. Your method call technique does not enable this.

          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

          Z 1 Reply Last reply
          0
          • H honey the codewitch

            you do understand that paged memory allows you to do pointer ops directly to a file, i assume? and that normally what you'd do is just create your data structures at that memory mapped address and then use them like normal classes and structure, which are automatically written to disk as they are accessed.

            struct foo {
            int bar;
            };

            foo* pfoo = VirtualAlloc(..., sizeof(foo));
            pfoo->bar=1; // writes to disk
            printf("%d",pfoo->bar); // reads from disk.

            there is simply no way to do that in .NET if you're saying there is show me how. Your method call technique does not enable this.

            When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

            Z Offline
            Z Offline
            zezba9000
            wrote on last edited by
            #93

            lol yes there is. You didn't read anything I said. As I said before. C# pointers are the same as C/C++. Look at the example below. I literally just compiled and ran this on my computer with zero errors.

            using System;
            using System.Runtime.InteropServices;

            using SIZE_T = System.IntPtr;
            using DWORD = System.UInt32;

            namespace TestNet
            {
            [StructLayout(LayoutKind.Sequential)]
            struct Foo
            {
            public int bar;
            }

            static class Program
            {
            	\[DllImport("Kernel32.dll")\]
            	private static unsafe extern void\* VirtualAlloc(void\* lpAddress, SIZE\_T dwSize, DWORD flAllocationType, DWORD flProtect);
            
            	private const DWORD MEM\_COMMIT = 0x00001000;
            	private const DWORD PAGE\_READWRITE = 0x04;
            
            	static unsafe void Main(string\[\] args)
            	{
            		Foo\* pfoo = (Foo\*)VirtualAlloc((void\*)0, (SIZE\_T)sizeof(Foo), MEM\_COMMIT, PAGE\_READWRITE);
            		pfoo->bar = 1; // writes to disk
            		Console.WriteLine(pfoo->bar.ToString()); // reads from disk.
            	}
            }
            

            }

            Make a C# console app and paste that code in. WaLa!!

            H T 2 Replies Last reply
            0
            • Z zezba9000

              lol yes there is. You didn't read anything I said. As I said before. C# pointers are the same as C/C++. Look at the example below. I literally just compiled and ran this on my computer with zero errors.

              using System;
              using System.Runtime.InteropServices;

              using SIZE_T = System.IntPtr;
              using DWORD = System.UInt32;

              namespace TestNet
              {
              [StructLayout(LayoutKind.Sequential)]
              struct Foo
              {
              public int bar;
              }

              static class Program
              {
              	\[DllImport("Kernel32.dll")\]
              	private static unsafe extern void\* VirtualAlloc(void\* lpAddress, SIZE\_T dwSize, DWORD flAllocationType, DWORD flProtect);
              
              	private const DWORD MEM\_COMMIT = 0x00001000;
              	private const DWORD PAGE\_READWRITE = 0x04;
              
              	static unsafe void Main(string\[\] args)
              	{
              		Foo\* pfoo = (Foo\*)VirtualAlloc((void\*)0, (SIZE\_T)sizeof(Foo), MEM\_COMMIT, PAGE\_READWRITE);
              		pfoo->bar = 1; // writes to disk
              		Console.WriteLine(pfoo->bar.ToString()); // reads from disk.
              	}
              }
              

              }

              Make a C# console app and paste that code in. WaLa!!

              H Offline
              H Offline
              honey the codewitch
              wrote on last edited by
              #94

              i'm going to try that. Assuming it works, I apologize for all the churn. You may have just taught my stubborn self something. the example really helped, so thank you.

              When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

              Z 1 Reply Last reply
              0
              • H honey the codewitch

                i'm going to try that. Assuming it works, I apologize for all the churn. You may have just taught my stubborn self something. the example really helped, so thank you.

                When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                Z Offline
                Z Offline
                zezba9000
                wrote on last edited by
                #95

                np ;)

                1 Reply Last reply
                0
                • H honey the codewitch

                  it's mixed mode, as I understand it. Managed *and* unmanaged in the same PE. So it's not simply a .NET assembly but an assembly with a bag on the side of unmanaged code. I'm certain this was true when it was introduced. It probably still is. also i think there's still marshalling going on with managed->unmanaged calls in C++/CLI it might be more efficient than the standard marshalling though, but it's still marshalling.

                  When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                  T Offline
                  T Offline
                  TheGreatAndPowerfulOz
                  wrote on last edited by
                  #96

                  See here[^]

                  #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                  H 1 Reply Last reply
                  0
                  • T TheGreatAndPowerfulOz

                    See here[^]

                    #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                    H Offline
                    H Offline
                    honey the codewitch
                    wrote on last edited by
                    #97

                    yeah thanks. Though what zebra006 (sp?) showed me was more what I was after. Either way, it gives me a starting point.

                    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                    T 1 Reply Last reply
                    0
                    • R Rajesh R Subramanian

                      honey the codewitch wrote:

                      Nobody made you respond to me.

                      If you're a nobody, then yes.

                      honey the codewitch wrote:

                      Now I'm blocking you so I don't have to listen to this anymore.

                      TMI - I don't need to know what you are doing on the internet.

                      T Offline
                      T Offline
                      TheGreatAndPowerfulOz
                      wrote on last edited by
                      #98

                      No reason to be an asshole.

                      #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                      R 1 Reply Last reply
                      0
                      • H honey the codewitch

                        I said they don't work how they are supposed to. How they were designed was to map files to a process address space so you could do pointer ops to read and write files. That is not doable under .NET. Sorry I've just explained this a lot. If you've used memory mapped files in unmanaged code then you know what i'm talking about. Otherwise you might never. I don't know. You cannot do var foo = new int[100000]; //backed by file. That's how it's supposed to work. It can't under .NET

                        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                        T Offline
                        T Offline
                        TheGreatAndPowerfulOz
                        wrote on last edited by
                        #99

                        honey the codewitch wrote:

                        It can't under .NET

                        not even with "unsafe"?

                        #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                        1 Reply Last reply
                        0
                        • Z zezba9000

                          lol yes there is. You didn't read anything I said. As I said before. C# pointers are the same as C/C++. Look at the example below. I literally just compiled and ran this on my computer with zero errors.

                          using System;
                          using System.Runtime.InteropServices;

                          using SIZE_T = System.IntPtr;
                          using DWORD = System.UInt32;

                          namespace TestNet
                          {
                          [StructLayout(LayoutKind.Sequential)]
                          struct Foo
                          {
                          public int bar;
                          }

                          static class Program
                          {
                          	\[DllImport("Kernel32.dll")\]
                          	private static unsafe extern void\* VirtualAlloc(void\* lpAddress, SIZE\_T dwSize, DWORD flAllocationType, DWORD flProtect);
                          
                          	private const DWORD MEM\_COMMIT = 0x00001000;
                          	private const DWORD PAGE\_READWRITE = 0x04;
                          
                          	static unsafe void Main(string\[\] args)
                          	{
                          		Foo\* pfoo = (Foo\*)VirtualAlloc((void\*)0, (SIZE\_T)sizeof(Foo), MEM\_COMMIT, PAGE\_READWRITE);
                          		pfoo->bar = 1; // writes to disk
                          		Console.WriteLine(pfoo->bar.ToString()); // reads from disk.
                          	}
                          }
                          

                          }

                          Make a C# console app and paste that code in. WaLa!!

                          T Offline
                          T Offline
                          TheGreatAndPowerfulOz
                          wrote on last edited by
                          #100

                          Thanks for sticking with it and being nice and teaching us all something new. :)

                          #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                          1 Reply Last reply
                          0
                          • H honey the codewitch

                            yeah thanks. Though what zebra006 (sp?) showed me was more what I was after. Either way, it gives me a starting point.

                            When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                            T Offline
                            T Offline
                            TheGreatAndPowerfulOz
                            wrote on last edited by
                            #101

                            ah yes, his example[^] is more succinct

                            #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                            H 1 Reply Last reply
                            0
                            • T TheGreatAndPowerfulOz

                              ah yes, his example[^] is more succinct

                              #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                              H Offline
                              H Offline
                              honey the codewitch
                              wrote on last edited by
                              #102

                              i love it when i learn stuff, even if i have to be dragged to it. I'm only curious if this worked in early .NET and I just missed it before, or if it's a byproduct of me dropping development for years and only recently playing catch up.

                              When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                              T 1 Reply Last reply
                              0
                              • T TheGreatAndPowerfulOz

                                No reason to be an asshole.

                                #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                                R Offline
                                R Offline
                                Rajesh R Subramanian
                                wrote on last edited by
                                #103

                                You don't seem to be taking your own advice seriously - I see you deem it fit to be an unreasonable asshole by starting a discussion with someone by calling them an asshole.

                                T 1 Reply Last reply
                                0
                                • H honey the codewitch

                                  i love it when i learn stuff, even if i have to be dragged to it. I'm only curious if this worked in early .NET and I just missed it before, or if it's a byproduct of me dropping development for years and only recently playing catch up.

                                  When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                  T Offline
                                  T Offline
                                  TheGreatAndPowerfulOz
                                  wrote on last edited by
                                  #104

                                  It worked in early .NET.

                                  #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                                  H 1 Reply Last reply
                                  0
                                  • T TheGreatAndPowerfulOz

                                    It worked in early .NET.

                                    #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                                    H Offline
                                    H Offline
                                    honey the codewitch
                                    wrote on last edited by
                                    #105

                                    thanks. i always thought you had to copy out.

                                    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                    1 Reply Last reply
                                    0
                                    • R Rajesh R Subramanian

                                      You don't seem to be taking your own advice seriously - I see you deem it fit to be an unreasonable asshole by starting a discussion with someone by calling them an asshole.

                                      T Offline
                                      T Offline
                                      TheGreatAndPowerfulOz
                                      wrote on last edited by
                                      #106

                                      Get a clue and take a hike.

                                      #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                                      R 1 Reply Last reply
                                      0
                                      • T TheGreatAndPowerfulOz

                                        Get a clue and take a hike.

                                        #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                                        R Offline
                                        R Offline
                                        Rajesh R Subramanian
                                        wrote on last edited by
                                        #107

                                        Go ahead, I'll follow your lead. In other words, don't preach what you don't practice. Or simply, follow your own advice.

                                        T 1 Reply Last reply
                                        0
                                        • R Rajesh R Subramanian

                                          Go ahead, I'll follow your lead. In other words, don't preach what you don't practice. Or simply, follow your own advice.

                                          T Offline
                                          T Offline
                                          TheGreatAndPowerfulOz
                                          wrote on last edited by
                                          #108

                                          You started this buddy by being a complete dick and jerk to another member here. You can finish it by just saying "I'm sorry -- won't happen again." Not to me, but to the other member. Or you can just sod-off. Until then expect to be treated by me like I see you treating others.

                                          #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

                                          R 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups