2012-06-26 1 views
1

내 Managed C++ DLL에서 컴파일 타임에 계산되는 const int가 있습니다. 이 값을 호출하는 C# 프로그램 내의 속성에서이 값을 사용해야합니다. 처음에는 const int 값을 반환하는 정적 메서드를 만들었지 만 C#에서는 컴파일 타임 const로 간주하지 않습니다. 나는 또한 DLL 네임 스페이스 내에서 CONST의 int로서 그것을 선언하려고관리되는 C++ DLL에서 const int를 C#으로 전달하여 속성의 필드 값으로 사용하는 방법

// C++ 
namespace MyNameSpace { 
    const int AttributeConstValue = 15 + sizeof(int); 
. . . 
} 

"네임 스페이스 MyNamespace에 존재하지 않는"C#을 반환에서 MyNameSpace.AttributeConstValue에 액세스 할 수

시도에 const를 통과 할 수있는 방법이 있나요 C# 그리고 그것을 const 표현으로 보았습니까?

답변

2

다른 관리되는 컴파일러에서 볼 수있는 공용 상수를 선언하려면 키워드 C++/CLI 을 사용해야합니다. 그리고 ref 클래스 안에 나타나야합니다.

namespace Example { 
    public ref class Constants { 
    public: 
     literal int AttributeConstValue = 15 + sizeof(int); 
    }; 
} 

샘플 C#을 사용 :이처럼

[MyAttribute(Example.Constants.AttributeConstValue)] 
// etc.. 

이 상당히 위험하다 조심하십시오. 리터럴 값은 C++/CLI 어셈블리에 대한 참조없이 C# 어셈블리의 메타 데이터로 컴파일됩니다. 따라서이 선언을 변경하더라도 이 아니라면 C# 프로젝트를 다시 컴파일하면 불쾌한 불일치가 발생합니다. 하지만 속성 선언에서 사용해야하는 한이 문제는 수정되지 않습니다.

+0

우리는 같은 대답을 동시에 게시하고 있었다. :) 감사! – JonN

+0

내 경우에는 안전하지 않은 조건이 C++ DLL 프로젝트와 C++ 프로젝트에 동일한 솔루션 내에서 빌드되는 C# 프로젝트에 의해 완화됩니다. – JonN

0

Const은 다른 선언입니다. 코드가 컴파일되기 시작하면 컴파일러는 const 값을 변경할 수 없으므로 const을 사용하는 모든 장소를 값으로 대체합니다. 그것은 한 번 컴파일 시간에 해결되고 그런 식으로 유지됩니다. 나는 정말로 기억하지 않는다. 그러나 나는 최적화 플래그가 심지어 코드에서 const 선언을 삭제한다고 생각한다. 따라서 상황은 다음과 같습니다. 컴파일을 완료하면 변경할 수 없으므로 먼저 함수에서 반환하거나 getter/setter가 올바른 것입니다. 분명히 당신은 변수를 const으로 돌려 보낼 수 없습니다. 반환하기 때문에 프로그램을 컴파일해야하고 프로그램을 컴파일 할 때 ... 당신은 요점을 얻습니다 :

P. C에 대해 ++ 있지만 C#을 const를 알고하지 마십시오 class 회원이며 namespace

+0

당신은 C# ** 속성 **의 필드 값으로이 상수를 사용해야하고 C# 컴파일러가 첫 번째 기술을 사용하여 상수 표현이 아니라고 불평했습니다. 이것에 대한 해결책은 내 대답을 참조하십시오. C# 사용법은 다음과 같습니다. [MarshalAs (UnmanagedType.ByValArray, SizeConst = MyNameSpace.ConstClass.AttributeConstValue] – JonN

+0

@JonN :'const' 변수는 상수 표현이 아닙니다 * 컴파일러는 반드시 상수 표현식을 원합니다 –

+0

@Eds 사실이지만 C#에서 사용할 수있는 기호 상수를 만드는 방법을 잘 모르겠습니다. Hans가 가리키는 ** 리터럴 ** 키워드를 사용하면 관리되는 C++에서 AttributeConstValue를 기호로 만듭니다. 그것은 상수 표현입니다. – JonN

0

찾을 수 대답 HERE

// C++ Const declaration 
namespace MyNameSpace { 
public ref class ConstClass { 
public: 
    literal int AttributeConstValue = 15 + sizeof(int); 
. . . 
} 

// C# Usage 
[MarshalAs(UnmanagedType.ByValArray, SizeConst=MyNameSpace.ConstClass.AttributeConstValue)] 
public byte [] results; 

참조하는 MyNameSpace.ConstClass.AttributeConstValue C#을 속성의 필드 값으로 잘 사용하여 작동이를 선언 할 수 없습니다 기술. 이 값은 컴파일 시간 상수 표현으로 간주됩니다.

관련 문제