标签: clr-hosting

什么是CLR托管?

什么是CLR托管?那是什么用例?

.net clr clr-hosting

31
推荐指数
2
解决办法
1万
查看次数

CLR在非CLR创建的线程中托管异常处理

问题:

从非托管代码进入CLR的线程中的未处理异常不会触发"正常"未处理异常CLR处理.

在下面的代码CSSimpleObject.GetstringLength()中用C++ 调用

  • "1"在调用线程(非CLR创建的线程)中抛出异常,
  • "2"在新的Thread()(CLR创建的线程)中抛出异常.

在"1"的情况下

  • 永远不会调用CurrentDomain_UnhandledException().
  • 应用程序域和进程将保持加载和运行的,你只会得到一个失败.

在"2"(预期行为)的情况下

  • 调用CurrentDomain_UnhandledException().
  • 这个过程被杀了.

问题:

要做出"正常"行为需要做些什么?

示例代码:

下面的代码基于" 所有互操作和融合样本 "中的Visual Studio 2010" CppHostCLR "代码示例.

RuntimeHost(C++):

PCWSTR pszStaticMethodName = L"GetStringLength";
PCWSTR pszStringArg = L"1";
//PCWSTR pszStringArg = L"2";

hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath,
    pszClassName, pszStaticMethodName, pszStringArg, &dwLengthRet);
if (FAILED(hr))
{
    wprintf(L"Failed to call GetStringLength w/hr 0x%08lx\n", hr);
    goto Cleanup;
}
Run Code Online (Sandbox Code Playgroud)

托管代码(C#):

public class CSSimpleObject
{
    public CSSimpleObject()
    {
    }
    //------8<----------
    public static int GetStringLength(string str)
    {
        AppDomain.CurrentDomain.UnhandledException += new …
Run Code Online (Sandbox Code Playgroud)

.net c++ clr exception-handling clr-hosting

17
推荐指数
1
解决办法
1861
查看次数

托管clr和捕获线程异常

我正在尝试编写一个可以加载托管插件的插件系统.如果有任何异常,主机应该能够卸载插件.对于我的poc,我在C#中有一个示例代码库,它会抛出这样的异常......

 public static int StartUp(string arguments)
 {
       Console.WriteLine("Started exception thrower with args {0}", arguments);
       Thread workerThread = new Thread(() => 
            {
                Console.WriteLine("Starting a thread, doing some important work");
                Thread.Sleep(1000);
                throw new ApplicationException();
            }
         );
         workerThread.Start();
         workerThread.Join();
         Console.WriteLine("this should never print");
        return 11;
    }
Run Code Online (Sandbox Code Playgroud)

然后我有这样的原生win32控制台应用程序..

int _tmain(int argc, _TCHAR* argv[])
{
    ICLRMetaHost *pMetaHost       = NULL;
    HRESULT hr; 
    ICLRRuntimeInfo *runtimeInfo = NULL;    
    __try
    {
        hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
        hr = pMetaHost->GetRuntime(L"v4.0.30319",IID_ICLRRuntimeInfo,(LPVOID*)&runtimeInfo);
        ICLRRuntimeHost *runtimeHost  = NULL;
        hr = runtimeInfo->GetInterface(CLSID_CLRRuntimeHost,IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost);    
        ICLRControl* clrControl …
Run Code Online (Sandbox Code Playgroud)

c# clr clr-hosting

13
推荐指数
1
解决办法
2860
查看次数

Excel VSTO如何工作?

Excel VSTO如何工作?如果我在Visual Studio 2005中创建Excel工作簿解决方案,那么我可以愉快地编写代码,完全访问Excel对象模型,甚至将Excel工作表视为设计图面.当我构建解决方案时,我得到一个.XLS文件和一个.DLL(包含我的C#代码).

我现在可以通过双击来启动Excel工作表,.XLS并且我的工作表上有我所有的C#代码和我在工作表上删除的任何控件等.

表格如何引用.DLL?excel工作簿/表的哪一部分告诉它需要启动CLR并托管我的程序集?

c# excel vsto clr-hosting

8
推荐指数
2
解决办法
6091
查看次数

将.NET程序集引用解析为其他名称?

我的项目引用了Library1.dllLibrary2.dll. Library2.dll依赖于Library1.dll,但它被编译为通过另一个名称Library1.Net40.dll引用它.

是否有一种很好的方式告诉我的应用程序重定向Library1.Net40.dll的所有引用以解析为Library1.dll?也许类似于使用<bindingRedirect>重定向版本的方式?

我有一个处理AppDomain.AssemblyResolve事件的解决方案,但它有点像黑客,我希望有更好的方法来做到这一点.

编辑:对于任何人的参考,这是我最终使用AppDomain.AssemblyResolve事件解决它以重定向到不同的程序集.

.net c# asp.net clr-hosting

7
推荐指数
1
解决办法
3961
查看次数

创建具有完全信任权限(包括网络权限)的托管CLR AppDomain

我需要在非托管进程中托管.NET运行时.我有通过COM加载运行时的代码,我可以将程序集加载到AppDomain并执行代码就好了.

但是,我遇到了托管在网络共享上的应用程序的问题,并且必须更改应用程序策略才能让它们执行而不是一个选项.所以我想要做的是将运行时的主AppDomain的权限级别设置为不受限制.

有人可以举例说明如何设置AppDomain策略级别吗?我无法弄清楚如何从非托管代码实例化所需的类来创建PolicyLevel和相关对象并设置策略.基本上我不知道我需要从我使用的C++代码中使用什么包含/命名空间引用.

这是我此时的代码:

/// Starts up the CLR and creates a Default AppDomain
DWORD WINAPI ClrLoad(char *ErrorMessage, DWORD *dwErrorSize)
{
    if (spDefAppDomain)
        return 1;


    //Retrieve a pointer to the ICorRuntimeHost interface
    HRESULT hr = CorBindToRuntimeEx(
                    ClrVersion, //Retrieve latest version by default
                    L"wks", //Request a WorkStation build of the CLR
                    STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN | STARTUP_CONCURRENT_GC, 
                    CLSID_CorRuntimeHost,
                    IID_ICorRuntimeHost,
                    (void**)&spRuntimeHost
                    );

    if (FAILED(hr)) 
    {
        *dwErrorSize = SetError(hr,ErrorMessage);   
        return hr;
    }

    //Start the CLR
    hr = spRuntimeHost->Start();

    if (FAILED(hr))
        return hr;

    CComPtr<IUnknown> pUnk;

    //Retrieve the …
Run Code Online (Sandbox Code Playgroud)

c# c++ clr-hosting security-policy

7
推荐指数
1
解决办法
1602
查看次数

如何将.tlb文件转换为标题和实现文件?

我正在尝试转换mscorlib.tlb.它通常在C++中使用,如下所示:

#import "mscorlib.tlb" raw_interfaces_only              \
     high_property_prefixes("_get","_put","_putref")        \
     rename("ReportEvent", "InteropServices_ReportEvent")
Run Code Online (Sandbox Code Playgroud)

如何将其转换为标题和实现文件?

我能够使用Visual Studio编译包含上面行的虚拟cpp文件,并生成一个.tlh文件.不应该有实施文件吗?

com idl typelib clr-hosting mscorlib

7
推荐指数
1
解决办法
6579
查看次数

CLR主机:使用任意方法签名调用函数?

我需要一个C++程序,加载CLR并在C#库中调用一个函数.我需要调用的函数将COM接口作为参数.

我的问题是,CLR托管接口似乎只允许您使用此签名调用方法:

int Foo(String arg)
Run Code Online (Sandbox Code Playgroud)

例如,这个C++代码加载CLR并在"test.exe"中运行P.Test函数:

ICLRRuntimeHost *pClrHost = NULL;
HRESULT hrCorBind = CorBindToRuntimeEx(NULL, L"wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pClrHost);

HRESULT hrStart = pClrHost->Start();

DWORD retVal;
HRESULT hrExecute = pClrHost->ExecuteInDefaultAppDomain(L"C:\\Test.exe", L"P", L"Test", L"", &retVal);
Run Code Online (Sandbox Code Playgroud)

我需要做的是用这个方法签名调用一个函数(注意我拥有C#代码,所以我可以改变它):

void SomeFunction(IFoo interface)
Run Code Online (Sandbox Code Playgroud)

其中IFoo是一个com接口.如果我可以调用这样的函数,我甚至可以做我需要的东西:

IntPtr SomeFunction();
Run Code Online (Sandbox Code Playgroud)

我可以让SomeFunction构造一个正确的委托,然后使用Marshal.GetFunctionPointerForDelegate.但是,我无法弄清楚除了使用int func(string)签名调用函数之外,如何使托管接口执行任何操作.

有谁知道如何从具有不同签名的C++代码调用C#函数?

(注意我不能使用C++/CLI.我需要使用托管API.)

c# clr clr-hosting

7
推荐指数
1
解决办法
2788
查看次数

我怎么知道哪个运行时主机当前运行我的代码?

由于Microsoft文档声明运行时主机 .NET具有多个运行时主机以支持和执行我们的应用程序的代码,我的问题是如何知道Microsoft运行时主机的哪些运行时主机托管我的代码.

我正在使用C#语言开发可由各种运行时主机使用和/或托管的dll类库,因此我需要知道哪个运行时主机现在托管我的代码以满足指定条件.

.net clr clr-hosting

7
推荐指数
1
解决办法
750
查看次数

是否可以在C程序中托管CLR?

我能找到的每个例子都是用C++编写的,但是我试图将我的项目保存在C中.是否有可能在C程序中托管CLR?

如果是这样,你能指点我一个例子吗?

c clr clr-hosting

6
推荐指数
1
解决办法
3810
查看次数

标签 统计

clr-hosting ×10

clr ×6

c# ×5

.net ×4

c++ ×2

asp.net ×1

c ×1

com ×1

excel ×1

exception-handling ×1

idl ×1

mscorlib ×1

security-policy ×1

typelib ×1

vsto ×1