我已经使用2.0框架尝试了以下代码,我得到了一个属性,但是当我在紧凑框架上尝试这个时,它总是返回一个空数组.MSDN文档说它支持,我做错了吗?
Test x = new Test();
FieldInfo field_info = x.GetType().GetField("ArrayShorts");
object[] custom_attributes = field_info.GetCustomAttributes(typeof(MarshalAsAttribute), false);
[StructLayout(LayoutKind.Sequential)]
public struct Test
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public ushort[] ArrayShorts;
}
Run Code Online (Sandbox Code Playgroud) c# attributes compact-framework marshalling getcustomattributes
我有一个系统,远程代理发送序列化结构(来自嵌入式C系统)供我通过IP/UDP读取和存储.在某些情况下,我需要发回相同的结构类型.我以为我使用Marshal.PtrToStructure(接收)和Marshal.StructureToPtr(发送)进行了很好的设置.但是,一个小问题是网络大端整数需要转换为我的x86小端格式才能在本地使用.当我再次发送它们时,大端是可行的方式.
以下是有问题的功能:
private static T BytesToStruct<T>(ref byte[] rawData) where T: struct
{
T result = default(T);
GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try
{
IntPtr rawDataPtr = handle.AddrOfPinnedObject();
result = (T)Marshal.PtrToStructure(rawDataPtr, typeof(T));
}
finally
{
handle.Free();
}
return result;
}
private static byte[] StructToBytes<T>(T data) where T: struct
{
byte[] rawData = new byte[Marshal.SizeOf(data)];
GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try
{
IntPtr rawDataPtr = handle.AddrOfPinnedObject();
Marshal.StructureToPtr(data, rawDataPtr, false);
}
finally
{
handle.Free();
}
return rawData;
}
Run Code Online (Sandbox Code Playgroud)
还有一个可以像这样使用的快速示例结构:
byte[] data = this.sock.Receive(ref …Run Code Online (Sandbox Code Playgroud) 使用Marshaller将java对象转换为XML非常容易.但我需要单独使用marshaller将java对象转换为JSON.我知道使用gson或Xstream就好了.但我需要使用Marshaller.如何实现它?
提前致谢.
我有以下C++函数定义,我试图通过托管代码通过PInvoke调用:
bool FooBar(SIZE_T* arg1);
Run Code Online (Sandbox Code Playgroud)
我的管理声明如下:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);
Run Code Online (Sandbox Code Playgroud)
有些人可能会注意到我最终做的同样的错误.这不是64位便携式.SIZE_T的大小可变(32-64位),指针也是如此.在托管大小上,指针正确转换为64位,但uint没有,并且您最终可以在arg1的高位中使用垃圾.这是一个特别持久的错误,因为垃圾通常只是零:(
我已经开始工作的唯一解决方案是以下管理声明:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);
Run Code Online (Sandbox Code Playgroud)
这当然有效,因为IntPtr可以正确地改变它的大小.在我的代码中,我只是将IntPtr视为一个整数,它可以工作,虽然它看起来像一个丑陋的黑客.在我看来应该有一些方法来正确指定,也许使用UnmanagedType.SysUInt,但我无法提出任何其他工作解决方案.
我有一个第三方组件,让我们说FIPreviewHandler来处理预览,它实现了IPreviewHandler.FIPreviewHandler实现为托管组件,并通过互操作使用IPreviewHandler接口和相关接口.FIPreviewHandler使用regasm.exe作为COM注册.
我有一个客户端应用程序也管理.我想在我的应用程序中创建一个FIPreviewHandler实例作为COM组件.
我有一个interop程序集,定义IPreviewHandler和相关的接口.
当我使用Activator.CreateInstance()创建一个FIPreviewHandler实例时,GetTypeByCLSID()返回的类型使用FIPreviewHandler的正确CLSID,它返回一个托管实例,因为它有实际的程序集可用,并跳过COM .当我尝试QI /将此实例转换为任何接口,例如IPreviewHandler时,它返回null,因为它作为托管对象加载,尽管FIPreviewHandler实现的IPreviewHandler接口与我在interop中的接口相同,但它在一个不同的命名空间/程序集中,因此为null.如果要返回一个COM实例/ RCW(System .__ ComObject),它将不会占用命名空间,并且可以正常转换,并返回一个有效的实例.
FIPreviewHandler是一个32位组件,在64位Win7机器上,如果我将我的客户端应用程序编译为"任何CPU",Activator.CreateInstance()将返回一个COM实例/ RCW(System .__ ComObject),因为它会查找64位实现FIPreviewHandler,因此返回一个代理.在这种情况下,我的应用程序工作正常.但是当我为x86编译它时,它获得32位实现,并返回实际托管类的托管实例,而不是COM实例,因此失败.
我不能使用FIPreviewHandler程序集中定义的接口,因为我必须为IPreviewHandler编写通用客户端,我的应用程序将与任何实现IPreviewHandler的组件一起使用,这对于基于C++的客户端访问FIPreviewHandler作为COM对象非常有用,但是失败了对于托管客户端.
我希望我有意义,我真的很感激任何帮助.
在编程环境中它是哪一个?有区别吗?我已经看到了两种方式,我不想在我的代码中拼写错误.
我试图根据定义的模式将对象中的数据编组到xml文件中.但是,当我打印出xml文件时,我在xml标签上收到了额外的注释.有没有办法摆脱额外的命名空间注释(即ns2)
这是我从编组中收到的xml的一个例子.
<?xml version="1.0" encoding="UTF-8" standalone="yes">
<root xmlns:ns2="http://www.something.com/something">
<ns2:food>steak</ns2:food>
<ns2:beverage>water</ns2:beverage>
</root>
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="yes">
<root xmlns="http://www.something.com/something">
<food>steak</food>
<beverage>water</beverage>
</root>
Run Code Online (Sandbox Code Playgroud)
这就是我的Java代码正在做的事情:
JAXBContext context = JAXBContext.newInstance("com.schema");
JAXBElement<FoodSchema> element = new JAXBElement<FoodSchema>
(new QName("FoodSchema"), Food.class, foodSchema);
Marshaller marshaller = context.createMarshaller();
OutputStream os = new FileOutputStream(object.getFilePath());
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(element, os);
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢!谢谢!
在我的serialiser/deserialiser中,我有以下代码段:
if (element_type.IsValueType && collection_type.IsArray)
{
try
{
GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
var array_data = new byte[arrayDataSize];
Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
h.Free();
WriteByteArray(array_data);
return;
}
catch (ArgumentException)
{
//if the value type is not blittable, then we need to serialise each array item one at a time
}
}
Run Code Online (Sandbox Code Playgroud)
其目的是尝试以尽可能最有效的方式(即,仅将内容作为一堆字节)写入流中的值类型数组.
当类型是值类型但不是blittable时,问题就出现了,Alloc()失败了.此时捕获异常并将控制权传递给处理数组的代码,就好像它由引用类型组成一样.
然而,由于我的应用程序中遇到的值类型的数量,此检查(由于抛出并捕获我理解的异常非常慢)被证明是严重的瓶颈.所以我想知道,检查类型是否是blittable的最快方法是什么?
我在网上广泛搜索但没有找到一个好的解释.
我的问题非常简单.
我有一个DLL,它有一个名为Initialize的函数,其中一个参数是一个指针,它将接收一个句柄,用于后续调用.另一个参数是一个字符串,我将列出完整性.我正在使用的签名是(简单形式):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
Run Code Online (Sandbox Code Playgroud)
DLL本身的签名写为:Initialize(LPTSTR name, HANDLE handle)注释"HANDLE:指向将接收句柄的位置".
随后的电话采取的形式
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
Run Code Online (Sandbox Code Playgroud)
我一直在阅读SafeHandle,我想知道我是否可以用它来替代我的IntPtr句柄.如果可以的话,我该怎么做?扩展抽象的SafeHandle类不是问题,但我可以直接用IntPtr替换SafeHandle(并使用默认编组)或者我是否需要做一些额外的事情?
标题说明了一切.
我想知道@XmlElement在字段/ getter/setter上放置JAXB注释(如)之间的主要区别是什么.在我看来(在简单的情况下)它并不重要.
我们拿这个吧
class A {
private String a;
public String getA() { return a; }
public void setA(String a) { this.a = a; }
}
Run Code Online (Sandbox Code Playgroud)
现在在我看来,如果我放置@XmlElement成员字段或getter/setter 并不重要.它只是编组好的.当我需要做出改变并且什么时候重要时,是否有任何用例?
当我去解组这个(xml回到A)JAXB具体做什么?
我正在使用JAXB MOXy实现
谢谢
marshalling ×10
c# ×6
java ×3
jaxb ×3
pinvoke ×2
xml ×2
.net ×1
attributes ×1
blit ×1
c++ ×1
com ×1
endianness ×1
handle ×1
interop ×1
intptr ×1
java-ee ×1
json ×1
proxy ×1
sockets ×1
terminology ×1
value-type ×1