가장 가치있는 .Net Compact Framework 팁, 트릭 및 Gotcha-Avoiders는 무엇입니까?
우리는 .Net Compact Framework 및 Windows Mobile에서 광범위하게 작업합니다. ASP.Net 앱 또는 기타 .Net 기반 데스크톱 앱의 개발과 관련하여 많은 질문이 나오지만 CF와 관련된 것은 없습니다.
Compact Framework에서 개발할 때 작업을 시작하고, 중지하고,하지 않는 작업을 공유 할 수있는 모바일 개발자가 있습니까?
확실한:
- 가능하면 물리적 장치를 사용하십시오 (에뮬레이터 아님).
- 여러 장치로 테스트 (다른 공급 업체, 다른 모델)
- 수면 / 각성 행동에 대한 집중 테스트
- MSTEST 단위 테스트를 사용할 때 개인 접근자를 사용하지 마십시오.
- 전염병과 같은 ActiveSync 방지-CoreCon Direct를 사용하여 디버그
- RPM에 익숙해지고 일찍 사용하십시오.
- 가능한 경우 개체 재사용
- Form의 ctor에서 많은 작업을하지 마십시오. 지연로드 나 백그라운드 스레드에서로드를 해제하십시오.
- 가능한 경우 요청시 양식로드 (한 번에 모두가 아님)
- 자주 사용되는 양식을 캐시하고 필요에 따라 자주 사용하지 않는 양식을 만듭니다.
- 이미지 해상도를 낮게 유지
- 클래스가 Dispose를 노출 하면 그것을 사용하십시오 . 항상.
- MVC / MVP 패턴을 활용하기에 너무 작은 앱은 없습니다.
- CF에 Microsoft CAB / SCSF 포트를 사용하지 마십시오 (이를 이식 한 사람들은 실제로 리소스가 제한된 장치를 사용한 적이 없음).
- 원격 데이터 / 서비스 활동을 수행 할 경우 "가끔 연결됨"개념에 익숙해집니다.
- 도킹 및 고정은 당신의 친구이자 적입니다-런타임 화면 회전과 여러 해상도를 테스트하십시오 (당신이 그들을 목표로 삼지 않을 것이라고 생각하더라도, 아마도 그 생각이 틀렸을 것입니다)
- 기기 배포 패키지 프로젝트 유형을 살펴 보되 크게 투자하지 마세요. 그것은 당신을 물릴 가능성이 큰 한계가 있습니다. 배치 파일이 놀랍도록 잘 작동하거나 CabWiz를 호출하는 사용자 지정 MSBUILD 작업
- C ++ 및 P / Invoke 기술을 연마하십시오. 당신 은 그것들 이 필요할 것입니다. P / Invoking없이 유용한 CF 앱을 작성하는 것은 거의 불가능합니다.
- 대상에 대한 가장 낮은 공통 분모로 코딩하십시오.
- 부분 클래스는 특히 대상 유형 (PPC, 전화, 비 모바일 CE)간에 논리를 나누는 데 유용합니다.
- 특히 CE 및 이전 WInMo 5의 경우 영구 저장소에서 앱을 실행하지 마십시오. RAM에 복사하고 거기에서 실행하여 특히 절전 / 깨우기주기 이후에 수요 페이징이 사용자를 죽이지 않도록합니다.
- 앱은 수면 / 깨우기 전환을 신경 쓰지 않아야하지만 이는 순수한 이론입니다. 수면 깨우기 **는 * 앱 동작을 변경하므로 다시 테스트, 테스트, 테스트합니다.
- 내가 테스트를 언급 했나요? 특히 손에 넣을 수있는 모든 장치에서? 테스트 랩을 위해 eBay에서 저렴한 하드웨어를 구입하십시오. 최신 장치의 특정 기능을 사용하려는 경우가 아니라면 최신 장치보다 더 많은 장치를 보유하는 것이 더 중요합니다.
- 프로그래밍 방식으로 블루투스를 사용할 계획이라면 신성한 개입을 요청하십시오. Widcomm 및 Microsoft 스택에 익숙해지고 두 스택이 동일하지 않음을 이해하십시오.
- Compact Framework의 메모리 관리에 대한 MSDN 웹 캐스트를 시청하십시오. 처음 놓친 내용을 다시 확인하세요.
- 내부 핸들을 무효화하고 액세스 위반을 유발하는 절전 / 깨우기에주의하십시오. 이것은 더 난해하지만 확실히 발생합니다. 예를 들어 저장소 카드에서 애플리케이션을 실행하는 경우 전체 앱이 RAM에로드되지 않습니다. 사용중인 조각은 실행을 위해 요청 페이지로 처리됩니다. 이것은 모두 좋고 좋습니다. 이제 장치의 전원을 끄면 드라이버가 모두 종료됩니다. 전원을 백업 할 때 많은 장치가 단순히 저장 장치를 다시 마운트합니다. 앱이 더 많은 프로그램에서 페이지를 요청해야 할 때 더 이상 존재하지 않고 죽습니다. 탑재 된 저장소의 데이터베이스에서도 유사한 동작이 발생할 수 있습니다. 데이터베이스에 대한 열린 핸들이있는 경우 절전 / 깨우기주기 후에 연결 핸들이 더 이상 유효하지 않을 수 있습니다.
- Platform Builder 평가판을 설치합니다 . 네트워크 UI, 많은 드라이버 등과 같은 많은 것들에 대한 소스 코드가 거기에 있으며 P / Invoke 코드가 예상 한 작업을 수행하지 않을 때 최소한 갈 곳이있을 것입니다. "왜".
5/25/10 추가됨
- WinMo의 전원 관리 API가 장치간에 일관되게 또는 적절하게 (또는 전혀) 작동하지 않을 것으로 기대하지 마십시오 . 실제로 동일한 하드웨어를 사용하더라도 OS 빌드에서 OS 빌드로 변경 될 수 있습니다.
7/27/10 추가됨
- 미적 UI를 원한다면 많은 사용자 정의 또는 수동 그리기를 할 준비를하십시오.
- 사용자 정의 또는 수동 그리기를 수행하고 투명성을 사용해야하는 경우 많은 좌절감에 대비하고 엉뚱한 코드 를 작성 하거나 네이티브 코드를 직접 호출 하여 CF의 단점 을 해결 하십시오.
11/22/11 추가됨
- BCL에 네임 스페이스 또는 클래스가 존재한다고해서 실제로 유용한 방식으로 구현되었다고 가정하지 마십시오. 인증서는 확실히 그렇지 않습니다 .
나는 단순히 목록에 추가하는 것입니다.
OpenNETCF 는 훌륭한 리소스입니다.
그들의 스마트 장치 프레임 워크 는 .NET Compact Framework에서 함께 개발할 때 진짜이 기능이없는 전체 프레임 워크의 많은 그래서 같이 가지고 있어야이다 누군가는 한 번 .NET Compact Framework에서이 NotImplementedException 래퍼 말했다 생각!]
이것은 Compact Framework 장치 에만 국한된 것은 아니지만 모바일 플랫폼에서 개발되는 리소스 제한으로 인해 개발할 때 훨씬 더 추한 머리를가집니다.
최근에 모바일 앱 중 하나 에서 DataGrid.DataSource 를 설정할 때 버그 에서 알지 못했던 누수를 식별하는 데 도움이되는 메모리 누수 관리 스레드의 일부로 멋진 게시물을 보았습니다 .
DataGrid를 바인딩 할 때 다음과 같은 것을 직접 사용 해서는 안됩니다 .
dgDataGrid.DataSource = dsDataSet;
이렇게하면 제대로 처리되지 않을 때마다 새로운 CurrencyManager가 생성됩니다. 대신 리소스 누수를 방지하기 위해 먼저 DataGrid를 BindingSource에 바인딩하려고합니다.
bsData.DataSource = dsDataSet;
dgDataGrid.DataSource = bsData;
누가 알았 겠어? Scott Langham은 다른 포스트 에서 했습니다 . 감사합니다 Scott!
여러 화면 크기 / 해상도를 지원해야하는 경우 양식 상속이이를 수행하는 훌륭한 방법입니다. 기본적으로 표준 320x240 화면에 맞게 양식을 디자인합니다. 다른 화면 크기를 지원하려면 새 양식을 추가하고 사용자 지정 양식 (단지 양식 대신)에서 상속 한 다음 필요에 따라 컨트롤을 다시 정렬하면됩니다.
또 다른 유용한 트릭은 부모 폼의 캡션을 ""로 일시적으로 설정할 수있는 방식으로 ShowDialog 호출을 래핑하는 것입니다. 이렇게하면 응용 프로그램에서 열려있는 모든 폼이 실행중인 프로그램 목록에 표시되지 않습니다. 래퍼를 향상시키는 또 다른 방법은 부모 창의 핸들을 사용하여 PInvoke SetForegroundWindow를 사용하는 것입니다. 이렇게하면 자녀가 닫힌 후에 부모가 항상 다시 나타납니다. 이 호출이 없으면 부모 폼 위의 z 스택에 다른 창을 삽입 할 수 있습니다.
SD 카드의 암호화에주의하십시오. SqlCE는 모두 작동을 중지합니다. 일부는 작동하고 일부는 작동하지 않기 때문에 Oracle Lite의 암호화 동작은 훨씬 더 불길합니다.
SqlCE RDA 및 병합 복제를 피하십시오. 안정적으로 작동한다면 환상적인 도구가 될 수 있지만 복제 중에 네트워크 연결이 예기치 않게 끊어 질 수있는 상황에서는 사용할 수 없습니다 (WM 세계에서 매우 흔함). 이것은 프로덕션 앱으로 나를 어렵게 만듭니다. 우리가 다룬 MS 지원 기술은 마침내 100 % 작동하지 않는다는 것을 인정해야했습니다. 실제 인용문 : "계속 복제하려고 시도하십시오. 결국 올바르게 병합 될 것입니다."
대부분의 일반적인 작업은 P / Invoke를 통해 Windows API를 직접 호출해야합니다. http://www.pinvoke.net/ 이 Win32와 Windows CE 모두에서 P / Invoke를위한 훌륭한 리소스 라는 것을 알게되었습니다 .
참고로 Visual Studio 2010에서 Compact Framework를 지원하지 않는 것에 대해 화가 난 경우 여기 로 이동 하여 추가를 위해 투표 하십시오 .
MS는 Connect에서 기존 기능 요청을 다소 포기했습니다. 이 기능 에 투표 하려면 새 사용자 음성 사이트로 이동하십시오 .
- Sql Server 3.5 Compact를 사용할 계획이라면 이 블로그를 읽어보십시오 .
- SQL Server Compact에는 심각한 성능 문제가 있으며 일부 코드는 데스크톱에 비해 장치에서 100 배 더 느릴 수 있으므로 항상 장치에서 데이터베이스 코드를 테스트하십시오.
- 장치에 대한 설정 장치 및 성능 / 통합 테스트. 또한 실제로이 작업을 수행하는 사람은 거의 없습니다. 그렇게 복잡하지 않고 비용이 훨씬 과중합니다.
- 코드를 항상 배포하는 경우 ActiveSync 대신 네트워크를 사용하십시오. 가장 쉬운 방법은 장치에 간단한 FTP 서버 또는 TCP 에이전트를 설정하는 것입니다.
Compact Framework 및 SqlCe를 사용하면 성능, 메모리 누수 및 스레드 동기화에 많은 문제가있을 수 있습니다.
Compact Framework-SqlCe 골칫거리를 최소화하기 위해 준수해야 할 규칙.
- 하나의 SqlCe 연결 사용-연결에 잠금 메커니즘을 사용하여 여러 스레드에서 하나의 연결을 사용할 수 있습니다.
- 대량 데이터 삽입은 Sqlce 엔진으로 인해 느립니다. 텍스트 파일에 직접 쓰는 것과 유사한 성능 이점이있는 직접 테이블 삽입을 사용하십시오.
- 응용 프로그램을 닫을 때 SqlCe 연결을 삭제합니다. 이렇게하면 모든 리소스가 정리됩니다.
- 데이터베이스를 호출 할 때마다 모든 명령, 데이터 리더 등을 폐기하십시오. 문장을 사용하는 것은 당신의 친구입니다. 판독기 객체가 명령문 등을 사용하여 명령 내에 있는지 확인하십시오.
OpenNet CF는 살펴볼 가치가 있습니다. 무료 버전에도 FTP, datagrid 추가 기능 등과 같은 몇 가지 유용한 라이브러리가 있습니다. CF에는 .net 프레임 워크 기능이 많지 않기 때문에 매우 유용합니다.
단위 테스트 (TDD)는 .net cf에서 가능합니다. 그러나 문제가 있습니다.
MSTest를 사용하게됩니다. NUnit, MBUnit, XUnit.net 등이 아닙니다. MSTest.
You will need Visual Studio Professional (as near as I can tell). The easiest way to get started is to right-click on a method you would like to test, then select "Create Unit Test". This sets up the test project for you. Only create one test project. It doesn't like having multiple. Just do this to create the project and get all of the dependencies setup for you. Then create your own test classes.
Mock objects could be an issue. RhinoMocks, Moq, and TypeMock all depend on things that are not available in .net cf. Pex has a project calls Stubs that I'm still looking into. Pex is a Microsoft Research project. You you will end up creating custom fake objects instead.
Test are run on the device emulator. That means they have to be deployed. If you get a strange error when you first start up the test runner, you probably do not have .net 3.5 on the device emulator yet. First deploy your project, then run the tests again.
On the non-testing side: You do get LINQ to Objects and LINQ to XML. Both are a godsend. You can talk to a server via WCF, but you don't get all of the endpoints.
When using a DataGrid you can sort it's contents via the column headers by using the following code originally posted on Chris Craft's blog:
using System.Windows.Forms;
using System.Data;
public static void SortDataGrid(object sender, System.Windows.Forms.MouseEventArgs e)
{
DataGrid.HitTestInfo hitTest;
DataTable dataTable;
DataView dataView;
string columnName;
DataGrid dataGrid;
// Use only left mouse button clicks.
if (e.Button == MouseButtons.Left)
{
// Set dataGrid equal to the object that called this event handler.
dataGrid = (DataGrid)sender;
// Perform a hit test to determine where the mousedown event occured.
hitTest = dataGrid.HitTest(e.X, e.Y);
// If the MouseDown event occured on a column header,
// then perform the sorting operation.
if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
{
// Get the DataTable associated with this datagrid.
dataTable = (DataTable)dataGrid.DataSource;
// Get the DataView associated with the DataTable.
dataView = dataTable.DefaultView;
// Get the name of the column that was clicked.
if(dataGrid.TableStyles.Count != 0)
columnName = dataGrid.TableStyles[0].GridColumnStyles[hitTest.Column].MappingName;
else
columnName = dataTable.Columns[hitTest.Column].ColumnName;
// If the sort property of the DataView is already the current
// column name, sort that column in descending order.
// Otherwise, sort on the column name.
if (dataView.Sort == columnName)
dataView.Sort = columnName + " DESC";
else
dataView.Sort = columnName;
}
}
}
private void dgDataGrid_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(dgDataGrid.VisibleRowCount == 0) return;
SortDataGrid(sender, e);
dgDataGrid.Select(dgDataGrid.CurrentRowIndex);
}
You will encounter a lot of Bugs and Limitations in .net cf. You will have to monkey patch them. its ugly but you will have no choice.
You will end up writing a lot of custom controls. As most of the controls in the framework don't support features that are commonly requested by clients. So its a good practice to create custom controls for each and every control you use from the start. Even though you might not have anything in them when you begin. You can add custom logic later on. Without having to modify a lot of existing code.
If you need validation you could use .net validation framework
- Its a good idea to sperate your code everywhere in your App. You could use the MVC pattern. And if you choose to use it you can get a head start by using MobileMVC
- If you need a rich UI tool kit you can look at Resco (google it).
- VS Designer will be your arch enemy.
This is all that i can think of right now.
When doing anything with OutlookSession, always
- instantiate it on the main (application) thread
- execute against it on the main thread (I use a Control object to Invoke against)
- and dispose of it within a decent timeframe (if you don't you'll have strange behavior in Pocket Outlook)
When working with Windows Mobile, if you don't want your form to be full screen you need to set the FormBorderStyle to None. If you don't then you will spend hours pulling out your hair wondering why it is resizing automatically to the full screen size (which is in fact a feature of Windows Mobile)
'developer tip' 카테고리의 다른 글
Mac OS X에서 MySQL이 설치된 위치 알아보기 (0) | 2020.11.16 |
---|---|
SQL Server-대용량 스크립트 파일 실행 (0) | 2020.11.16 |
C #의 저장 프로 시저에서 반환 값 가져 오기 (0) | 2020.11.16 |
jQuery에서 bind와 live 메소드의 차이점은 무엇입니까? (0) | 2020.11.16 |
Vim에서 커서 아래에있는 모든 현재 용어를 바꿉니다. (0) | 2020.11.16 |