2017-11-08 13 views
0

GetMethod를 사용하고 싶지만 코드를 작성할 때 intellisense에 따라 메소드가 존재하지 않는 문제가 있습니다. GetMethod를 사용하면 GetRuntimeMethod가 사용되어 프로젝트를 빌드합니다. 그러나 메서드를 가져 오려고하면 항상 null이 반환됩니다.Xamarin PCL profile 111 GetMethod는 디버그에서만 사용 가능합니다.

내가 브레이크 포인트에 넣고에서

dbConnection.GetMethod("CreateTableAsync"); 

를 작성하는 경우 해당 코드가 SQLiteAsyncConnection보고

Type dbConnection = Database.GetType(); 
MethodInfo method = dbConnection.GetRuntimeMethod("CreateTableAsync", new Type[]{}); 

이 null를 돌려 "CreateTableAsync"를 얻으려고 ...하지만 내 직접 실행 창 ... 메서드가 존재하고 적절한 MethodInfo를 반환합니다.

왜?

+0

감사 :이 일을

한 가지 방법은 런타임에 호출되지 않습니다 클래스를 만드는 것입니다,하지만, 링커 힌 충분하다. CreateTableAsync에는 하나의 매개 변수가 있지만 기본값 인 CreateFlags = CreateFlag.None이 있으므로 Type 배열에 아무 것도 필요하지 않다고 가정했습니다. "new type [] {typeof (CreateFlags)}"를 추가하면 MethodInfo가 반환됩니다. –

답변

1

리플렉션을 사용하여 메서드를 가져오고 호출하는 경우 링커에서 직접 호출 된 것을 볼 수 없습니다. 따라서 릴리스 모드에서 앱을 빌드 할 때 링커는 코드를 제거합니다.

이 문제를 방지하려면이 코드를 제거하지 말아야한다는 링커에 알릴 필요가 있습니다. 실제로 비록 내 문제를 발견,

[Preserve(AllMembers = true)] 
public class LinkerPleaseInclude 
{ 
    public void Include(SQLiteAsyncConnection connection) 
    { 
     connection.CreateTableAsync(); 
    } 
}