C# System.Runtime.InteropServices 相关学习总结

.Net 专栏收录该内容
270 篇文章 2 订阅

System.Runtime.InteropServices.COMException的解决方法

http://www.jb51.net/article/17629.htm

完美解决“换另一台电脑上用VS2008继续开发web项目时出现“System.Runtime.InteropServices.COMException”,然后是加载不了项目。” 

只需要打开项目配置文件*.csproj,将<UseIIS>True</UseIIS> 改为 False,然后可以正常加载项目,接着重新配置为正常的IIS. 
========

异常详细信息: System.Runtime.InteropServices.COMException

http://www.cnblogs.com/star250/archive/2008/03/06/1093720.html


无效的类别字符串
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 


异常详细信息: System.Runtime.InteropServices.COMException: 无效的类别字符串


源错误: 


 行 88:                String ss=Server.MapPath("rpt\\S_CardTradeDayDetail.rpt").ToString();
            行 89:                CrystalReportSource1.ReportDocument.Load(Server.MapPath("rpt\\S_CardTradeDayDetail.rpt"), OpenReportMethod.OpenReportByTempCopy);
            
有一台服务器部署时出现这样的问题
权限问题 
解决方法有几种 
第1种.给asp.net帐号分配好访问com的权限,配置好com+ 
第2种.在web.config的system.web节加入 
<identity impersonate="true" userName="具有管理员权限的帐号名" password="相应的密码"/> 
来模拟一个具有管理权限的身份来运行你的代码 


我使用了第二种方法,为什么在其他服务器上没有这个问题,可能是这个服务器权限设置过高,请知道的朋友解答一下。谢谢! 


2008-4-11 我发现在用第二种方法也不行,第3种:给C:\WINDOWS\Temp 文件夹增加用户 NETWORK SERVICE ,并拥有修改权限。 //我想这是因为水晶报表要在C:\WINDOWS\Temp 产生临时文件的原因
========

System.Runtime.InteropServices 命名空间

https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices(v=vs.80).aspx
.NET Framework 2.0 其他版本 
System.Runtime.InteropServices 命名空间提供各种各样支持 COM interop 及平台调用服务的成员。如果您对这些服务不熟悉,请参见 与非托管代码交互操作。
此命名空间提供了多种类别的功能,如下表所示。属性可控制封送行为,例如如何安排结构或表示字符串。其中最重要的属性有 DllImportAttribute(可以用来定义用于访问非托管 API 的平台调用方法)和 MarshalAsAttribute(可以用来指定如何在托管内存与非托管内存之间封送数据)。

  说明
公共类 AutomationProxyAttribute 指定是否应该使用自动化封送拆收器或自定义代理及存根 (Stub) 对该类型进行封送处理。
公共类 BestFitMappingAttribute 控制是否将 Unicode 字符转换为最接近的匹配 ANSI 字符。
公共类 BStrWrapper 将 VT_BSTR 类型的数据从托管代码封送到非托管代码。无法继承此类。
公共类 ClassInterfaceAttribute 为公开给 COM 的类指定要生成的类接口的类型(如果有接口生成)。
公共类 CoClassAttribute 指定从类型库中导入的 coclass 的类标识符。
公共类 ComAliasNameAttribute 指示参数或字段类型的 COM 别名。
公共类 ComCompatibleVersionAttribute 向 COM 客户端指示程序集当前版本中的所有类与该程序集早期版本中的类兼容。
公共类 ComConversionLossAttribute 指示从类型库向程序集导入类或接口时丢失了有关信息。
公共类 ComDefaultInterfaceAttribute 指定要向 COM 公开的默认接口。无法继承此类。
公共类 ComEventInterfaceAttribute 标识源接口和实现事件接口(从 COM 类型库导入 coclass 时生成)的方法的类。
公共类 COMException 当从 COM 方法调用返回无法识别的 HRESULT 时引发的异常。
公共类 ComImportAttribute 指示该属性化类型是以前在 COM 中定义的。
公共类 ComRegisterFunctionAttribute 指定当注册用于 COM 的程序集时调用的方法;这可以用于注册过程中用户编写代码的执行。
公共类 ComSourceInterfacesAttribute 为属性化类标识公开为 COM 事件源的一组接口。
公共类 ComUnregisterFunctionAttribute 指定当注销用于 COM 的程序集时调用的方法;这可以用于注销过程中用户编写代码的执行。
公共类 ComVisibleAttribute 控制程序集中个别托管类型、成员或所有类型对 COM 的可访问性。
公共类 CriticalHandle 表示句柄资源的包装类。
公共类 CurrencyWrapper 对封送拆收器应该将其作为 VT_CY 封送的对象进行包装。
公共类 DefaultCharSetAttribute 指定 CharSet 枚举的值。无法继承此类。
公共类 DefaultParameterValueAttribute 当从支持默认参数的语言执行调用时,设置参数的默认值。无法继承此类。
公共类 DispatchWrapper 对封送拆收器应该将其作为 VT_DISPATCH 封送的对象进行包装。
公共类 DispIdAttribute 指定方法、字段或属性的 COM 调度标识符 (DISPID)。
公共类 DllImportAttribute 指示该属性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。
公共类 ErrorWrapper 对封送拆收器应该将其作为 VT_ERROR 封送的对象进行包装。
公共类 ExtensibleClassFactory 在创建过程中启用从非托管对象扩展的托管对象的自定义。
公共类 ExternalException 所有 COM Interop 异常和结构化异常处理 (SEH) 异常的异常基类型。
公共类 FieldOffsetAttribute 指示字段在类或结构的非托管表示形式内的物理位置。
公共类 GuidAttribute 当不需要自动 GUID 时提供显式的 System.Guid。
公共类 HandleCollector 跟踪未处理的句柄,并在达到指定阈值时强制执行垃圾回收。
公共类 IDispatchImplAttribute 指示当向 COM 公开双重接口和调度接口时公共语言运行库使用何种 IDispatch 实现。
公共类 ImportedFromTypeLibAttribute 指示在程序集内定义的类型原来在类型库中定义。
公共类 InAttribute 指示应将数据从调用方封送到被调用方,而不返回到调用方。
公共类 InterfaceTypeAttribute 指示向 COM 公开时,托管接口是双重的、仅支持调度的、还是仅支持 IUnknown 的。
公共类 InvalidComObjectException 当使用无效的 COM 对象时引发的异常。
公共类 InvalidOleVariantTypeException 封送拆收器在遇到不能封送到托管代码的 Variant 类型的参数时引发的异常。
公共类 LCIDConversionAttribute 指示方法的非托管签名需要区域设置标识符 (LCID) 参数。
公共类 Marshal 提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。
公共类 MarshalAsAttribute 指示如何在托管代码和非托管代码之间封送数据。
公共类 MarshalDirectiveException 当封送拆收器遇到它不支持的 MarshalAsAttribute 时引发的异常。
公共类 OptionalAttribute 指示参数是可选的。
公共类 OutAttribute 指示应将数据从被调用方封送回调用方。
公共类 PreserveSigAttribute 指示应取消在 COM interop 调用期间发生的 HRESULT 或 retval 签名转换。
公共类 PrimaryInteropAssemblyAttribute 指示该属性化的程序集是主 Interop 程序集。
公共类 ProgIdAttribute 允许用户指定类的 ProgID。
公共类 RegistrationServices 提供一组用于注册和注销托管程序集以供从 COM 使用的服务。
公共类 RuntimeEnvironment 提供一个返回有关公共语言运行库环境的信息的 static 方法的集合。
公共类 SafeArrayRankMismatchException 当传入的 SAFEARRAY 的秩与托管签名中指定的秩不匹配时引发的异常。
公共类 SafeArrayTypeMismatchException 当传入的 SAFEARRAY 的类型与托管签名中指定的类型不匹配时引发的异常。
公共类 SafeHandle 表示操作系统句柄的包装类。
公共类 SEHException 表示结构化异常处理程序 (SEH) 错误。
公共类 SetWin32ContextInIDispatchAttribute 此属性已被否决。
公共类 StandardOleMarshalObject 用标准 OLE STA 封送拆收器替换标准公共语言运行库 (CLR) 自由线程封送拆收器。
公共类 StructLayoutAttribute StructLayoutAttribute 类使用户可以控制类或结构的数据字段的物理布局。
公共类 TypeLibConverter 提供一组服务,将托管程序集转换为 COM 类型库或进行反向转换。
公共类 TypeLibFuncAttribute 包含最初从 COM 类型库为此方法导入的 FUNCFLAGS。
公共类 TypeLibImportClassAttribute 指定哪个 Type 独占使用接口。无法继承此类。
公共类 TypeLibTypeAttribute 包含最初为此类型从 COM 类型库导入的 TYPEFLAGS。
公共类 TypeLibVarAttribute 包含最初为此字段从 COM 类型库导入的 VARFLAGS。
公共类 TypeLibVersionAttribute 指定导出类型库的版本号。
公共类 UnknownWrapper 对封送拆收器应该将其作为 VT_UNKNOWN 封送的对象进行包装。
公共类 UnmanagedFunctionPointerAttribute 控制作为非托管函数指针传入或传出非托管代码的委托签名的封送行为。无法继承此类。
公共类 VariantWrapper 将 VT_VARIANT | VT_BYREF 类型的数据从托管代码封送到非托管代码。无法继承此类。
接口
  接口 说明
公共接口 _Activator 向非托管代码公开 System.Activator 类。
公共接口 _Assembly 向非托管代码公开 System.Reflection.Assembly 类的公共成员。
公共接口 _AssemblyBuilder 向非托管代码公开 System.Reflection.Emit.AssemblyBuilder 类。
公共接口 _AssemblyName 向非托管代码公开 AssemblyName 类。
公共接口 _Attribute 向非托管代码公开 System.Attribute 类。
公共接口 _ConstructorBuilder 向非托管代码公开 System.Reflection.Emit.ConstructorBuilder 类。
公共接口 _ConstructorInfo 向非托管代码公开 System.Reflection.ConstructorInfo 类的公共成员。
公共接口 _CustomAttributeBuilder 向非托管代码公开 System.Reflection.Emit.CustomAttributeBuilder 类。
公共接口 _EnumBuilder 向非托管代码公开 System.Reflection.Emit.EnumBuilder 类。
公共接口 _EventBuilder 向非托管代码公开 System.Reflection.Emit.EventBuilder 类。
公共接口 _EventInfo 向非托管代码公开 System.Reflection.EventInfo 类的公共成员。
公共接口 _Exception 向非托管代码公开 System.Exception 类的公共成员。
公共接口 _FieldBuilder 向非托管代码公开 System.Reflection.Emit.FieldBuilder 类。
公共接口 _FieldInfo 向非托管代码公开 System.Reflection.FieldInfo 类的公共成员。
公共接口 _ILGenerator 向非托管代码公开 System.Reflection.Emit.ILGenerator 类。
公共接口 _LocalBuilder 向非托管代码公开 System.Reflection.Emit.LocalBuilder 类。
公共接口 _MemberInfo 向非托管代码公开 System.Reflection.MemberInfo 类的公共成员。
公共接口 _MethodBase 向非托管代码公开 System.Reflection.MethodBase 类的公共成员。
公共接口 _MethodBuilder 向非托管代码公开 MethodBuilder 类。
公共接口 _MethodInfo 向非托管代码公开 System.Reflection.MethodInfo 类的公共成员。
公共接口 _MethodRental 向非托管代码公开 System.Reflection.Emit.MethodRental 类。
公共接口 _Module 向非托管代码公开 Module 类。
公共接口 _ModuleBuilder 向非托管代码公开 System.Reflection.Emit.ModuleBuilder 类。
公共接口 _ParameterBuilder 向非托管代码公开 System.Reflection.Emit.ParameterBuilder 类。
公共接口 _ParameterInfo 向非托管代码公开 System.Reflection.ParameterInfo 类。
公共接口 _PropertyBuilder 向非托管代码公开 System.Reflection.Emit.PropertyBuilder 类。
公共接口 _PropertyInfo 向非托管代码公开 System.Reflection.PropertyInfo 类的公共成员。
公共接口 _SignatureHelper 向非托管代码公开 System.Reflection.Emit.SignatureHelper 类。
公共接口 _Thread 向非托管代码公开 System.Threading.Thread 类。
公共接口 _Type 向非托管代码公开 System.Type 类的公共成员。
公共接口 _TypeBuilder 向非托管代码公开 System.Reflection.Emit.TypeBuilder 类。
公共接口 ICustomAdapter 为客户端访问实际对象(而不是自定义封送拆收器分发的适配器对象)提供了一种方式。
公共接口 ICustomFactory 使用户能够为扩展 MarshalByRefObject 的托管对象编写激活代码。
公共接口 ICustomMarshaler 旨在提供用于处理方法调用的自定义包装。
公共接口 IRegistrationServices 提供一组用于注册和注销托管程序集以供从 COM 使用的服务。
公共接口 ITypeLibConverter 提供一组服务,将托管程序集转换为 COM 类型库或进行反向转换。
公共接口 ITypeLibExporterNameProvider 当导出到类型库时提供名称大小写控制。
公共接口 ITypeLibExporterNotifySink 提供回调机制,以供程序集转换器向调用方通知转换的状态,并在转换过程本身之中涉及调用方。
公共接口 ITypeLibImporterNotifySink 提供回调机制,以供类型库转换器向调用方通知转换的状态,并在转换过程本身之中涉及调用方。
公共接口 UCOMIBindCtx 应改用 BIND_OPTS。
公共接口 UCOMIConnectionPoint 应改用 IConnectionPoint。
公共接口 UCOMIConnectionPointContainer 应改用 IConnectionPointContainer。
公共接口 UCOMIEnumConnectionPoints 应改用 IEnumConnectionPoints。
公共接口 UCOMIEnumConnections 应改用 IEnumConnections。
公共接口 UCOMIEnumMoniker 应改用 IEnumMoniker。
公共接口 UCOMIEnumString 应改用 IEnumString。
公共接口 UCOMIEnumVARIANT 应改用 IEnumVARIANT。
公共接口 UCOMIMoniker 应改用 IMoniker。
公共接口 UCOMIPersistFile 注意:此接口现在已过时。应改用 IPersistFile。
公共接口 UCOMIRunningObjectTable 应改用 IRunningObjectTable。
公共接口 UCOMIStream 应改用 IStream。
公共接口 UCOMITypeComp 应改用 ITypeComp。
公共接口 UCOMITypeInfo 应改用 ITypeInfo。
公共接口 UCOMITypeLib 应改用 ITypeLib。
结构
  结构 说明
公共结构 ArrayWithOffset 在指定的数组中封装数组和偏移量。
公共结构 BIND_OPTS 应改用 BIND_OPTS。
公共结构 BINDPTR 应改用 BINDPTR。
公共结构 CONNECTDATA 应改用 CONNECTDATA。
公共结构 DISPPARAMS 应改用 DISPPARAMS。
公共结构 ELEMDESC 应改用 ELEMDESC。
公共结构 ELEMDESC.DESCUNION 应改用 ELEMDESC.DESCUNION。
公共结构 EXCEPINFO 应改用 EXCEPINFO。
公共结构 FILETIME 应改用 FILETIME。
公共结构 FUNCDESC 应改用 FUNCDESC。
公共结构 GCHandle 提供从非托管内存访问托管对象的方法。
公共结构 HandleRef 包装一个托管对象,该对象保存使用平台 invoke(调用)传递给非托管代码的资源句柄。
公共结构 IDLDESC 应改用 IDLDESC。
公共结构 PARAMDESC 应改用 PARAMDESC。
公共结构 STATSTG 应改用 STATSTG。
公共结构 TYPEATTR 应改用 TYPEATTR。
公共结构 TYPEDESC 应改用 TYPEDESC。
公共结构 TYPELIBATTR 应改用 TYPELIBATTR。
公共结构 VARDESC 应改用 VARDESC。
公共结构 VARDESC.DESCUNION 注意:此结构已过时。应改用 VARDESC.DESCUNION。
委托
  委托 说明
公共委托 ObjectCreationDelegate 创建 COM 对象。
枚举
  枚举 说明
公共枚举 AssemblyRegistrationFlags 定义当注册程序集时使用的一组标志。
公共枚举 CALLCONV 应改用 CALLCONV。
公共枚举 CallingConvention 指定调用在非托管代码中实现的方法所需的调用约定。
公共枚举 CharSet 规定封送字符串应使用何种字符集。
公共枚举 ClassInterfaceType 标识为某个类生成的类接口的类型。
公共枚举 ComInterfaceType 标识如何向 COM 公开接口。
公共枚举 ComMemberType 描述 COM 成员的类型。
公共枚举 DESCKIND 应改用 DESCKIND。
公共枚举 ExporterEventKind 描述类型库导出程序在导出类型库时生成的回调。
公共枚举 FUNCFLAGS 应改用 FUNCFLAGS。
公共枚举 FUNCKIND 应改用 FUNCKIND。
公共枚举 GCHandleType 表示 GCHandle 类可以分配的句柄的类型。
公共枚举 IDispatchImplType 指示对特定类使用何种 IDispatch 实现。
公共枚举 IDLFLAG 应改用 IDLFLAG。
公共枚举 IMPLTYPEFLAGS 应改用 IMPLTYPEFLAGS。
公共枚举 ImporterEventKind 描述类型库导入程序在导入类型库时生成的回调。
公共枚举 INVOKEKIND 应改用 INVOKEKIND。
公共枚举 LayoutKind 控制当导出到非托管代码时对象的布局。
公共枚举 LIBFLAGS 应改用 LIBFLAGS。
公共枚举 PARAMFLAG 应改用 PARAMFLAG。
公共枚举 RegistrationClassContext 指定执行上下文集,类对象将在这些上下文中对请求构造实例的请求可用。
公共枚举 RegistrationConnectionType 定义到类对象的连接的类型。
公共枚举 SYSKIND 应改用 SYSKIND。
公共枚举 TYPEFLAGS 应改用 TYPEFLAGS。
公共枚举 TYPEKIND 应改用 TYPEKIND。
公共枚举 TypeLibExporterFlags 指示应该如何生成类型库。
公共枚举 TypeLibFuncFlags 描述从中导入该方法的 COM 类型库中 FUNCFLAGS 的原始设置。
公共枚举 TypeLibImporterFlags 指示应该如何生成程序集。
公共枚举 TypeLibTypeFlags 描述从中导入该类型的 COM 类型库中 TYPEFLAGS 的原始设置。
公共枚举 TypeLibVarFlags 描述从中导入此变量的 COM 类型库中 VARFLAGS 的原始设置。
公共枚举 UnmanagedType 指定如何将参数或字段封送到非托管代码。
公共枚举 VarEnum 指示当数组作为 UnmanagedType.SafeArray 从托管代码封送到非托管代码时,如何封送该数组的元素。
公共枚举 VARFLAGS 应改用 VARFLAGS。
========
GCHandle Structure
https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle(v=vs.110).aspx


.NET Framework (current version) Other Versions 
 
Provides a way to access a managed object from unmanaged memory.
Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)


Syntax
C#C++F#VB
[ComVisibleAttribute(true)]
public struct GCHandle
Properties
Name Description
System_CAPS_pubproperty IsAllocated
Gets a value indicating whether the handle is allocated.
System_CAPS_pubproperty Target
Gets or sets the object this handle represents.
Methods
Name Description
System_CAPS_pubmethod AddrOfPinnedObject()
Retrieves the address of an object in a GCHandleType.Pinned handle.
System_CAPS_pubmethodSystem_CAPS_static Alloc(Object)
Allocates a Normal handle for the specified object.
System_CAPS_pubmethodSystem_CAPS_static Alloc(Object, GCHandleType)
Allocates a handle of the specified type for the specified object.
System_CAPS_pubmethod Equals(Object)
Determines whether the specified GCHandle object is equal to the current GCHandle object.(Overrides ValueType.Equals(Object).)
System_CAPS_pubmethod Free()
Releases a GCHandle.
System_CAPS_pubmethodSystem_CAPS_static FromIntPtr(IntPtr)
Returns a new GCHandle object created from a handle to a managed object.
System_CAPS_pubmethod GetHashCode()
Returns an identifier for the current GCHandle object.(Overrides ValueType.GetHashCode().)
System_CAPS_pubmethod GetType()
Gets the Type of the current instance.(Inherited from Object.)
System_CAPS_pubmethodSystem_CAPS_static ToIntPtr(GCHandle)
Returns the internal integer representation of a GCHandle object.
System_CAPS_pubmethod ToString()
Returns the fully qualified type name of this instance.(Inherited from ValueType.)
Operators
Name Description
System_CAPS_puboperatorSystem_CAPS_static Equality(GCHandle, GCHandle)
Returns a value indicating whether two GCHandle objects are equal.
System_CAPS_puboperatorSystem_CAPS_static Explicit(GCHandle to IntPtr)
A GCHandle is stored using an internal integer representation.
System_CAPS_puboperatorSystem_CAPS_static Explicit(IntPtr to GCHandle)
A GCHandle is stored using an internal integer representation.
System_CAPS_puboperatorSystem_CAPS_static Inequality(GCHandle, GCHandle)
Returns a value indicating whether two GCHandle objects are not equal.
Remarks
The GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. This handle can be one of four types: Weak, WeakTrackResurrection, Normal, or Pinned. When the handle has been allocated, you can use it to prevent the managed object from being collected by the garbage collector when an unmanaged client holds the only reference. Without such a handle, the object can be collected by the garbage collector before completing its work on behalf of the unmanaged client.
You can also use GCHandle to create a pinned object that returns a memory address to prevent the garbage collector from moving the object in memory.
When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. When you free a pinned handle, the associated object will be unpinned and will become eligible for garbage collection, if there are no other references to it.
Examples
The following example shows an App class that creates a handle to a managed object using the GCHandle.Alloc method, which prevents the managed object from being collected. A call to the EnumWindows method passes a delegate and a managed object (both declared as managed types, but not shown), and casts the handle to an IntPtr. The unmanaged function passes the type back to the caller as a parameter of the callback function.
C#VB
using System;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Permissions;


public delegate bool CallBack(int handle, IntPtr param);


public class LibWrap
{
// passing managed object as LPARAM
// BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);


[DllImport("user32.dll")]
public static extern bool EnumWindows(CallBack cb, IntPtr param);
}


public class App
{
public static void Main()
{
Run();
}


        [SecurityPermission(SecurityAction.Demand, UnmanagedCode=true)]
public static void Run()
        {
TextWriter tw = System.Console.Out;
GCHandle gch = GCHandle.Alloc(tw);


CallBack cewp = new CallBack(CaptureEnumWindowsProc);


// platform invoke will prevent delegate to be garbage collected
// before call ends


LibWrap.EnumWindows(cewp, GCHandle.ToIntPtr(gch));
gch.Free();
        }


private static bool CaptureEnumWindowsProc(int handle, IntPtr param)
{
GCHandle gch = GCHandle.FromIntPtr(param);
TextWriter tw = (TextWriter)gch.Target;
tw.WriteLine(handle);
return true;
}
}
Version Information
Universal Windows Platform 
Available since 8
.NET Framework 
Available since 1.1
Portable Class Library 
Supported in: portable .NET platforms 
Silverlight 
Available since 2.0
Windows Phone Silverlight 
Available since 7.0
Windows Phone 
Available since 8.1
Thread Safety
Any public static ( Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
See Also
GCHandleType
System.Runtime.InteropServices Namespace
The Truth About GCHandles
========

GuidAttribute 类

https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.guidattribute.aspx
.NET Framework (current version) 其他版本 
 
提供一个显式 System.Guid 出现自动 GUID 时不需要。
命名空间:   System.Runtime.InteropServices
程序集:  mscorlib(位于 mscorlib.dll)


继承层次结构
System.Object
  System.Attribute
    System.Runtime.InteropServices.GuidAttribute


语法
C#C++F#VB
[AttributeUsageAttribute(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate, 
Inherited = false)]
[ComVisibleAttribute(true)]
public sealed class GuidAttribute : Attribute
构造函数
名称 说明
System_CAPS_pubmethod GuidAttribute(String)
新实例初始化 GuidAttribute 带有指定 GUID 的类。
属性
名称 说明
System_CAPS_pubproperty TypeId
在派生类中实现时,获取此 Attribute 的唯一标识符。(继承自 Attribute。)
System_CAPS_pubproperty Value
获取Guid的类。
方法
名称 说明
System_CAPS_pubmethod Equals(Object)
此 API 支持 产品 基础结构,不应从代码直接使用。 返回一个值,该值指示此实例是否与指定的对象相等。(继承自 Attribute。)
System_CAPS_pubmethod GetHashCode()
返回此实例的哈希代码。(继承自 Attribute。)
System_CAPS_pubmethod GetType()
获取当前实例的 Type。(继承自 Object。)
System_CAPS_pubmethod IsDefaultAttribute()
在派生类中重写时,指示此实例的值是否是派生类的默认值。(继承自 Attribute。)
System_CAPS_pubmethod Match(Object)
当在派生类中重写,则返回一个值,该值指示此实例是否等于指定的对象。(继承自 Attribute。)
System_CAPS_pubmethod ToString()
返回表示当前对象的字符串。(继承自 Object。)
显式接口实现
名称 说明
System_CAPS_pubinterfaceSystem_CAPS_privmethod _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)
将一组名称映射为对应的一组调度标识符。(继承自 Attribute。)
System_CAPS_pubinterfaceSystem_CAPS_privmethod _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)
检索对象的类型信息,然后可以使用该信息获取接口的类型信息。(继承自 Attribute。)
System_CAPS_pubinterfaceSystem_CAPS_privmethod _Attribute.GetTypeInfoCount(UInt32)
检索对象提供的类型信息接口的数量(0 或 1)。(继承自 Attribute。)
System_CAPS_pubinterfaceSystem_CAPS_privmethod _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)
提供对某一对象公开的属性和方法的访问。(继承自 Attribute。)
备注
可以将此特性应用到程序集、 接口、 类、 枚举、 结构或委托,尽管 Tlbimp.exe(类型库导入程序) 可以将其应用为您导入类型库时。
传递给该属性的字符串必须是该类型的可接受的构造函数参数的格式 Guid。 若要避免与该类型的冲突 Guid, ,使用长名称 GuidAttribute 显式。 类型必须具有特定的 GUID 时,只能使用一个显式 GUID。 如果省略该属性,则会自动分配一个 GUID。
示例
下面的示例演示如何将应用 GuidAttribute 于导出到具有固定的 GUID 的 COM 类。
C#C++VB
using System;
using System.Runtime.InteropServices;


[GuidAttribute("9ED54F84-A89D-4fcd-A854-44251E925F09")]
public class SampleClass 
{
    // Insert class members here.
}
版本信息
通用 Windows 平台 
自 8 起可用
.NET Framework 
自 1.1 起可用
可移植类库 
在 可移植 .NET 平台 中受支持
Silverlight 
自 2.0 起可用
Windows Phone Silverlight 
自 7.0 起可用
Windows Phone 
自 8.1 起可用
线程安全
此类型的所有公共静态(Visual Basic 中的 已共享 在 Visual Basic 中)成员都是线程安全的。不保证所有实例成员都是线程安全的。
另请参阅
Guid
System.Runtime.InteropServices 命名空间
Tlbimp.exe(类型库导入程序)
========

用System.Runtime.InteropServices服务的DllImport方法引入非托管代码程序集  

http://blog.163.com/yuyi_84225505@126/blog/static/36297389201271602234279/
extern 主要用于声明在外部实现的方法,什么叫外部实用的方法呢,一般说来就是用System.Runtime.InteropServices服务的DllImport方法引入非托管代码程序集。例如调用系统API,C语言写的方法等等。在这种情况下,声明必须为static


同时,extern 关键字还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。


下面是一个改写自MSDN上的简单的例子,调用系统winmm.DLL播放wav文件:


//系统API的调用的声明
        [System.Runtime.InteropServices.DllImport("winmm.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        public static extern void PlaySound(string path,System.IntPtr hMod,PlaySoundFlags flags);


//调用该方法


    string path = @"c:\111.wav";
            try
            {
                PlaySound(path, new System.IntPtr(), PlaySoundFlags.SND_SYNC);
            }
            catch (Exception ex)
            {
                throw (ex);
            } 


C#读写ini文件的类,调用kernel32.dll中的api:WritePrivateProfileString,GetPrivateProfileString


using  System.Runtime.InteropServices;


using  System.Text; 


namespace  INIFile


{


     ///  <summary>


     ///  读写ini文件的类


     ///  调用kernel32.dll中的两个api:WritePrivateProfileString,GetPrivateProfileString来实现对ini  文件的读写。


     ///


     ///  INI文件是文本文件,


     ///  由若干节(section)组成,


     ///  在每个带括号的标题下面,


     ///  是若干个关键词(key)及其对应的值(value)


     /// 


  ///[Section]


  ///Key=value


     ///


     ///  </summary>


     public  class  IniFile


     {


         ///  <summary>


         ///  ini文件名称(带路径)


         ///  </summary>


         public  string  filePath; 


          //声明读写INI文件的API函数


         [DllImport("kernel32")] 


         private  static  extern  long  WritePrivateProfileString(string  section,string  key,string  val,string  filePath);
 


         [DllImport("kernel32")]


         private  static  extern  int  GetPrivateProfileString(string  section,string  key,string  def,StringBuilder  retVal,int  size,string  filePath);


 
         ///  <summary>


         ///  类的构造函数


         ///  </summary>


         ///  <param  name="INIPath">INI文件名</param> 


         public  IniFile(string  INIPath)   


         { 


              filePath  =  INIPath; 


         }


 
         ///  <summary>


         ///   写INI文件


         ///  </summary>


         ///  <param  name="Section">Section</param>


         ///  <param  name="Key">Key</param>


         ///  <param  name="value">value</param>
         public  void  WriteInivalue(string  Section,string  Key,string  value)   
         {     


              WritePrivateProfileString(Section,Key,value,this.filePath); 


         }


         ///  <summary>


         ///    读取INI文件指定部分


         ///  </summary>


         ///  <param  name="Section">Section</param>


         ///  <param  name="Key">Key</param>


         ///  <returns>String</returns> 


         public  string  ReadInivalue(string  Section,string  Key) 


         {   


              StringBuilder  temp  =  new  StringBuilder(255);


              int  i  =  GetPrivateProfileString(Section,Key,"",temp,255,this.filePath); 


              return  temp.ToString();


         } 


     } 


}
========

与非托管代码交互操作

https://msdn.microsoft.com/zh-cn/library/sd10k43k(v=vs.80).aspx
.NET Framework 2.0 其他版本 
Microsoft .NET Framework 将促进与 COM 组件、COM+ 服务、外部类型库和许多操作系统服务的互操作。在托管和非托管对象模型之间,数据类型、方法签名和错误处理机制都存在差异。为了简化 .NET Framework 组件和非托管代码之间的互用并便于进行移植,公共语言运行库将从客户端和服务器中隐藏这两种对象模型之间的差异。
在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。
本节内容
与非托管代码交互操作帮助主题
提供指向在有关与非托管代码进行互操作的概念性文档中找到的所有帮助主题的链接。
向 .NET Framework 公开 COM 组件
描述如何从基于 .NET 的应用程序使用 COM 组件。
向 COM 公开 .NET Framework 组件
描述如何从 COM 应用程序使用基于 .NET 的组件。
使用非托管 DLL 函数
描述如何使用平台调用来调用非托管的 DLL 函数。
互操作的设计注意事项
提供有关编写集成 COM 组件的提示。
互操作封送处理
描述如何对 COM Interop 和平台调用进行封送处理。
如何:映射 HRESULT 和异常
描述异常和 HRESULT 之间的映射。
使用泛型类型进行交互操作
描述泛型类型在用于 COM interop 时的行为。
相关章节
高级开发技术
提供指向关于 .NET Framework 中的高级开发任务和技术的更多信息的链接。
========

高级开发技术

https://msdn.microsoft.com/zh-cn/library/a493kdy6(v=vs.80).aspx
本主题提供指向有关 .NET Framework 中复杂开发任务和技术的信息的链接。
本节内容
管理
提供有关使用目录服务和 Windows Management Instrumentation (WMI) 的信息。
设计环境的组件创作
描述如何创建自定义组件以及如何扩展设计时支持。
异步编程设计模式
讨论 .NET Framework 中的异步编程功能。
动态源代码生成和编译
解释代码文档对象模型 (CodeDOM),该模型实现了多种编程语言的源代码的输出。
发出动态方法和程序集
描述 System.Reflection.Emit 命名空间中的一组托管类型,它们允许编译器或工具在运行时发出元数据和 Microsoft 中间语言 (MSIL),或者也可以允许它们在磁盘上生成可移植可执行 (PE) 文件。
垃圾回收
讨论垃圾回收器如何管理内存以及您如何可以通过编程来更有效地使用内存。
承载公共语言运行库
解释运行库宿主概念,将运行库加载到进程中,在该进程内创建应用程序域,并且加载和执行用户代码。
互操作性
描述由公共语言运行库提供的互操作性服务。还提供一些链接,指向有关将 COM 组件集成到 .NET Framework 应用程序中的信息。
网络编程
演示如何使用 Internet 访问类来实现基于 Web 的应用程序和基于 Internet 的应用程序。
反射
解释如何通过使用反射在运行时访问类型信息。
可靠性
描述面向可靠性的属性(如 HPA 和 ReliabilityContract)的用法,讨论编写可靠代码的最佳做法。
远程对象
描述 .NET Framework 中为远程通信提供的多种通信方法。
序列化
讨论 XML 序列化。
托管线程处理
解释对进程处理的运行时支持以及如何使用各种同步技术编程。
编写服务组件
描述如何配置和注册服务组件以访问 COM+ 服务。
参考
System.Reflection.Emit
说明 Emit 命名空间的主要功能。
相关章节
核心开发技术
提供指向有关 .NET Framework 中标准应用程序开发任务的信息的链接。
.NET Framework 中的安全性
提供一些链接,指向有关 .NET Framework 中的类和服务的信息,这些类和服务可以帮助确保应用程序开发的安全。
========
  • 1
    点赞
  • 2
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值