私は、DirectShowLibとInteropをアンマネージで使用するVideoRendererElementプロジェクト(http://videorendererelement.codeplex.com/)に基づいてWebカメラアプリケーションを構築しています。アクティブxコンポーネント。私はVisual Studio 2010を使用していますが、.NET 3.5(2.0 clr runtime)をターゲットにしています。マネージコードを呼び出すアンマネージドコードは、デプロイされたマシンでは動作しません。
開発マシンで問題なくビルドして実行することができました(Visual Studioの外でも)。しかし、ターゲットマシン(Windows 7、.NETの最新、C++再配布可能なもの)にアプリをデプロイすると、アプリケーションがクラッシュします。実行中のアプリケーションをターゲットマシン上のテキストファイルに記録する追加の方法を設定しました。一つの重要な違いを追跡しました。管理されていないコードはマネージコードのメソッドを呼び出します。これはターゲットマシン(コードをデプロイしたマシン)でのみ発生します。ここにいくつかのコードスニペットと私が記録したものがあります。混乱しているのは、このエラーがターゲットマシンでのみ発生するということです。正しい方向で私を指し示す助けがあれば大いに感謝します。アプリの.NETの一部になる前に
namespace MediaBridge
{
.....
public class MediaBridgeManager
{
public delegate void NewMediaGraphInfo(MediaBridgeGraphInfo GraphInfo);
private static readonly Dictionary<string, NewMediaGraphInfo> _delegateHash = new Dictionary<string, NewMediaGraphInfo>();
......
public static void AddMediaGraphInfo(MediaBridgeGraphInfo GraphInfo)
{
if (_delegateHash.ContainsKey(GraphInfo.MediaUrl))
{
NewMediaGraphInfo callback = _delegateHash[GraphInfo.MediaUrl];
_delegateHash.Remove(GraphInfo.MediaUrl);
/* Suppress all errors on the callback */
try
{
callback(GraphInfo);
}
catch {}
}
}
......
public static bool RegisterCallback(string MediaUrl, NewMediaGraphInfo Callback)
{
bool returnval = true;
MediaUrl = FormatUrl(MediaUrl);
if (!_delegateHash.ContainsKey(MediaUrl))
{
_delegateHash.Add(MediaUrl, Callback);
}
else
{
returnval = false;
}
return returnval;
}
}
}
は、最初の()RegisterCallbackを呼び出し、URLとコールバック機能を_delegateHashに移入されます。これは、ターゲットマシンのログファイルで確認されました。今
管理されていない部分:私のログファイルMediaBridgeによる
STDMETHODIMP CMediaBridgeSourceFilter::Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
{
/* Thread-saftey */
CAutoLock cAutoLockShared(&m_cSharedState);
HRESULT phr = S_OK;
/* Create the output pin for our filter */
m_pPin = new CMediaBridgeSourceFilterPin(&phr, this);
/* Create a new class to store information about us/graph in it */
MediaBridge::MediaBridgeGraphInfo^graphInfo = gcnew MediaBridge::MediaBridgeGraphInfo();
/* Set the media url sent */
graphInfo->MediaUrl = gcnew System::String(lpwszFileName);
/* Set the pointer to the filter graph */
graphInfo->FilterGraph = System::IntPtr(this->GetFilterGraph());
/* Store the pointer for our instance of the filter */
graphInfo->SourceFilter = System::IntPtr(this);
/* Do the callback into our managed code */
MediaBridge::MediaBridgeManager::AddMediaGraphInfo(graphInfo);
return phr;
}
:: MediaBridgeManager :: AddMediaGraphInfo().NET側で呼び出されているが、_delegateHash変数があるため、コールバックに達することはありません今空です。
RegisterCallback(): MediaUrl = dshowmediabridge://d0ffd222-d023-483b-8fc7-4b4035ce3922/ Contains Key: True Delegate Hash count: 1
InitializeDirectShow(): RegisterCallback == true, Url == DShowMediaBridge://d0ffd222-d023-483b-8fc7-4b4035ce3922
AddMediaGraphInfo(): MediaUrl = dshowmediabridge://d0ffd222-d023-483b-8fc7-4b4035ce3922/ FilterGraph: 71122304 Contains Key: False Delegate Hash count: 0
委任ハッシュ・カウント(_delegateHash.Count)が0になりましたがどのように注:ここでは
は私のログファイルは、私が上でアプリケーションを展開しようとしているターゲットマシン上で言っていることですアンマネージコードはAddMediaGraphInfo()を呼び出します。
VSが私の開発マシンで行っているターゲットマシンで、COM/C++へのDLLを特定するために何かしなければならないことはありますか?
デバッグモードでコンパイルしましたか?あなたはVS上にVSがインストールされているPCにのみインストールされるVSデバッグモードのredist dllにDLLの問題があるかもしれません。試してみてください... –
ありがとうJ.N.私はリリースモードでソリューションを構築しました。 – Reg
私はまだ100%確信しているわけではありませんが、これは開発ボックスで機能しましたが、これはVisual Studio 2005/2008からビルドされたオープンソースのソリューションで、VS 2010にインポートしたので、元のActiveXコントロールファイルをアプリケーションディレクトリはVS2010がソリューションで構築したものを上書きし、再登録して動作します。私はそれがVS 2010とWindows SDK(7.1)以降のバージョンのMSBuildをターゲットにしてビルドしていると思っています。.NET 4がCOMとのinteropを処理する方法の根本的な変更があると理解しています。 。 – Reg