当前位置:编程学习 > C#/ASP.NET >>

C# 类实例化后的内存地址如何取得

一个类的对象实例化后如何获取到内存的地址?  如果获取到了内存地址如何取地址里的值,然后再往地址里写入值?

这个方法我主要是想实现: 在一软件里提供一接口,让另一个软件通过这个接口来取得一些数据并更改里面的一些数据。 软件是winfrm,不采用webservers。其实就是在一台电脑里运行这两个软件。 我想到一个办法就是定义一个接口,该接口通过COM去操作那个软件,但这样不好如何操作,又想直接操作内存去处理? 


不知那位高手有好的办法不? --------------------编程问答-------------------- 对象在内存里经常浮动,谁跟你说物理地址是固定不变的? --------------------编程问答-------------------- 不要只会点c、c++概念。

大多数公司招聘码农,不是为了搞这个底层概念,而是高级地能干点项目。 --------------------编程问答-------------------- 百度 共享内存 C# 

或找 植物大战僵尸内存修改器源码 C# csdn下载里面也有,就是你想要的了 --------------------编程问答-------------------- struct可以,reference object不是不可以,但是需要对clr hacking有很深入的理解,我想能做到的人除了微软,这个地球上不超过2位数。 --------------------编程问答-------------------- 当然了,如果你就是实现一个进程通讯,这是一个弱爆了的需求,蓝翔学生都可以做。

不要啥也不会就想解决“难题”。你这个好比“如何把物体以光速运动”,仔细一问原来你连电子邮件都不知道,只会写信,看人家用电子邮件的能随时联系,想当然的认为人家是用一种超快速的工具运送纸信。 --------------------编程问答--------------------
引用 1 楼 sp1234 的回复:
对象在内存里经常浮动,谁跟你说物理地址是固定不变的?

物理地址是固定的 数值型的 (除了string 类型),他是有规律的,程序的运行基址+偏移地址 就是程序中的某个变量的地址了。
--------------------编程问答--------------------
引用 6 楼 wyd1520 的回复:
引用 1 楼 sp1234 的回复:
对象在内存里经常浮动,谁跟你说物理地址是固定不变的?
物理地址是固定的 数值型的 (除了string 类型),他是有规律的,程序的运行基址+偏移地址 就是程序中的某个变量的地址了。


你知道一点,又不全知道,囫囵吞枣,不求甚解。

你说的基本上是static variable,事实上还有在heap和stack上分配的。 --------------------编程问答--------------------
引用 7 楼 caozhy 的回复:
引用 6 楼 wyd1520 的回复:引用 1 楼 sp1234 的回复:
对象在内存里经常浮动,谁跟你说物理地址是固定不变的?
物理地址是固定的 数值型的 (除了string 类型),他是有规律的,程序的运行基址+偏移地址 就是程序中的某个变量的地址了。

你知道一点,又不全知道,囫囵吞枣,不求甚解。

你说的基本上是static variable,事实上还……

班主说的极是。但楼主说的用到static variable这个即可,而且代码还是他自己开发的他自己控制就行了,又不是那个搞游戏外挂。。。 --------------------编程问答--------------------
引用 5 楼 caozhy 的回复:
当然了,如果你就是实现一个进程通讯,这是一个弱爆了的需求,蓝翔学生都可以做。

不要啥也不会就想解决“难题”。你这个好比“如何把物体以光速运动”,仔细一问原来你连电子邮件都不知道,只会写信,看人家用电子邮件的能随时联系,想当然的认为人家是用一种超快速的工具运送纸信。


高级黑。 --------------------编程问答-------------------- 调用Com接口,在C#会比较麻烦,最大的问题就是CLR静态类型在编译期就已经绑定了,需要一堆的反射+接口/类型的转换
但用VB.Net就不一样了,由于VB中类型可以后期绑定,获取到某接口的COM实例后,可以直接调用接口方法,但带来的问题就是类型安全以及调试的困难(由于存在AppDomain跨域问题,有些异常是捕获不到的,单步调试时会直接跳出调试)

Public Class ComProxy

Public Sub New(typeCLSID As Guid)
        If typeCLSID = Guid.Empty Then
            Throw New ArgumentNullException("CLSID")
        End If
        Try
            Dim type As Type
            type = System.Type.GetTypeFromCLSID(typeCLSID)
            Me.ComObject = Activator.CreateInstance(type)
            Me._clsID = typeCLSID
        Catch exp As Exception
            Throw New System.ComponentModel.Win32Exception("Failed to create instance by CLSID for COM: " & typeCLSID.ToString(), exp)
        End Try
    End Sub

    Public Sub New(progID As String)
        If String.IsNullOrEmpty(progID) Then
            Throw New ArgumentNullException("progId")
        End If
        Try
            Me.ComObject = GetObject(, progID) 'VB方法  
              'Me.ComObject = Marshal.GetActiveObject(progID)  'Net方法
            Me._progID = progID
        Catch exp As Exception
            Throw New System.ComponentModel.Win32Exception("Failed to create instance by ProgID for COM: " & progID, exp)
        End Try
    End Sub

可以直接使用New ComProxy().COM接口方法()  会有编译警告
但好处也是很明显的
--------------------编程问答--------------------
引用 10 楼 dongxinxi 的回复:
最大的问题就是CLR静态类型在编译期就已经绑定了,需要一堆的反射+接口/类型的转换

你还是.NET 3.5的老皇历了。 --------------------编程问答--------------------
引用 11 楼 caozhy 的回复:
引用 10 楼 dongxinxi 的回复:最大的问题就是CLR静态类型在编译期就已经绑定了,需要一堆的反射+接口/类型的转换
你还是.NET 3.5的老皇历了。


是啊,私下里玩高版的。其实早看了VS2010发布会上那个犀利的反射例子 --------------------编程问答-------------------- 自己实现个clr,取消托管堆,把C#弄成C --------------------编程问答-------------------- 让一个软件去操作另一个软件?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,