프로그래밍 방식으로 .idl 파일을 만들고 있습니다. 프로그래밍 방식으로 인터페이스 및 메소드에 대한 UUID를 작성하는 방법
프로그래밍 방식으로 UUID를 생성 할 수 있습니까?
프로그래밍 방식으로 .idl 파일을 만들고 있습니다. 프로그래밍 방식으로 인터페이스 및 메소드에 대한 UUID를 작성하는 방법
프로그래밍 방식으로 UUID를 생성 할 수 있습니까?
답변:
당신은 아마 찾고 있습니다 System.Guid.NewGuid()
.
ToString(string format)
합니다. 여러 형식 지정자 중 하나를 허용 하는 오버로드를 사용할 수 있습니다 .
System.Guid.NewGuid().ToString("B").ToUpper()
소문자 UUID를 이해할 수없는 일부 MS 빌드 도구와 호환되기를 원할 것입니다 . 예를 들어, vdproj
설치 프로젝트에는 대문자 UUID가 있으며 소문자로 예외를 발생시킵니다.
.NET Guid 및 (RFC4122) UUID의 문자열 표현은 동일하지만 저장소 형식은 다릅니다 . .NET은 리틀 엔디안 바이트로 처음 세 Guid
부분 을 교환 합니다.
바이트를 전송하는 경우 (예를 들어 base64), 그냥 사용 Guid.ToByteArray()
하고 인코딩 할 수 없습니다 . Array.Reverse
처음 세 부분 (Data1-3) 이 필요합니다 .
나는 이것을 이렇게한다 :
var rfc4122bytes = Convert.FromBase64String("aguidthatIgotonthewire==");
Array.Reverse(rfc4122bytes,0,4);
Array.Reverse(rfc4122bytes,4,2);
Array.Reverse(rfc4122bytes,6,2);
var guid = new Guid(rfc4122bytes);
특정 .NET 구현 세부 정보는 이 답변 을 참조 하십시오.
편집 : 내부가 바이트 배열 생성자 및에서 나오는 바이트 배열의 형식과 관련이 없음을 지적한 Code Ranger의 Jeff Walker에게 감사드립니다 ToByteArray()
.
Guid
가 .idl을 의도했기 때문에 OP가 의미 할 수 있음을 알았지 만 방금 이것에 부딪 쳤습니다. 여기 Bingers와 Google 직원이 있습니다.
ToByteArray
그렇지 않습니다. 그들은 항상 lil'-endian입니다. 수신을 편집하십시오.
다음은 클라이언트 측 "순차 GUID"솔루션입니다.
http://www.pinvoke.net/default.aspx/rpcrt4.uuidcreate
using System;
using System.Runtime.InteropServices;
namespace MyCompany.MyTechnology.Framework.CrossDomain.GuidExtend
{
public static class Guid
{
/*
Original Reference for Code:
http://www.pinvoke.net/default.aspx/rpcrt4/UuidCreateSequential.html
*/
[DllImport("rpcrt4.dll", SetLastError = true)]
static extern int UuidCreateSequential(out System.Guid guid);
public static System.Guid NewGuid()
{
return CreateSequentialUuid();
}
public static System.Guid CreateSequentialUuid()
{
const int RPC_S_OK = 0;
System.Guid g;
int hr = UuidCreateSequential(out g);
if (hr != RPC_S_OK)
throw new ApplicationException("UuidCreateSequential failed: " + hr);
return g;
}
/*
Text From URL above:
UuidCreateSequential (rpcrt4)
Type a page name and press Enter. You'll jump to the page if it exists, or you can create it if it doesn't.
To create a page in a module other than rpcrt4, prefix the name with the module name and a period.
. Summary
Creates a new UUID
C# Signature:
[DllImport("rpcrt4.dll", SetLastError=true)]
static extern int UuidCreateSequential(out Guid guid);
VB Signature:
Declare Function UuidCreateSequential Lib "rpcrt4.dll" (ByRef id As Guid) As Integer
User-Defined Types:
None.
Notes:
Microsoft changed the UuidCreate function so it no longer uses the machine's MAC address as part of the UUID. Since CoCreateGuid calls UuidCreate to get its GUID, its output also changed. If you still like the GUIDs to be generated in sequential order (helpful for keeping a related group of GUIDs together in the system registry), you can use the UuidCreateSequential function.
CoCreateGuid generates random-looking GUIDs like these:
92E60A8A-2A99-4F53-9A71-AC69BD7E4D75
BB88FD63-DAC2-4B15-8ADF-1D502E64B92F
28F8800C-C804-4F0F-B6F1-24BFC4D4EE80
EBD133A6-6CF3-4ADA-B723-A8177B70D268
B10A35C0-F012-4EC1-9D24-3CC91D2B7122
UuidCreateSequential generates sequential GUIDs like these:
19F287B4-8830-11D9-8BFC-000CF1ADC5B7
19F287B5-8830-11D9-8BFC-000CF1ADC5B7
19F287B6-8830-11D9-8BFC-000CF1ADC5B7
19F287B7-8830-11D9-8BFC-000CF1ADC5B7
19F287B8-8830-11D9-8BFC-000CF1ADC5B7
Here is a summary of the differences in the output of UuidCreateSequential:
The last six bytes reveal your MAC address
Several GUIDs generated in a row are sequential
Tips & Tricks:
Please add some!
Sample Code in C#:
static Guid UuidCreateSequential()
{
const int RPC_S_OK = 0;
Guid g;
int hr = UuidCreateSequential(out g);
if (hr != RPC_S_OK)
throw new ApplicationException
("UuidCreateSequential failed: " + hr);
return g;
}
Sample Code in VB:
Sub Main()
Dim myId As Guid
Dim code As Integer
code = UuidCreateSequential(myId)
If code <> 0 Then
Console.WriteLine("UuidCreateSequential failed: {0}", code)
Else
Console.WriteLine(myId)
End If
End Sub
*/
}
}
키워드 : CreateSequentialUUID SequentialUUID
나는 방법에 대해 모른다. 그러나 GUID 유형은 다음을 통해 수행 할 수 있습니다.
Guid iid = System.Runtime.InteropServices.Marshal.GenerateGuidForType(typeof(IFoo));
C #에서 UUID 구현과 같은 Java를 사용하는 GitHub Gist가 있습니다 : https://gist.github.com/rickbeerendonk/13655dd24ec574954366
UUID는 Java에서와 같이 가장 중요하지 않은 비트로 만들 수 있습니다. 또한 노출시킵니다. 구현시 GUID로 명시 적으로 변환하고 GUID에서 내재적으로 변환합니다.
Guid.NewGuid()
합니까?